关于隐式类型,Nocturne Studio的博客文章(http://blog.csdn.net/zqustc/article/details/1868276)总结得很好,直接用它的就好了!
隐式类型变量的使用
C# 3.0中引入了隐式类型变量(Implicitly Typed Variables)。从我的观点来看,它与object类型以及泛型有着相似的地方。它就是使用一个新的关键字var,来代替先前一般应用中的指定一个固定格式的变量类型(int、double、string等等)。看一个例子:
// 显式类型定义 int myInt = 0; bool myBool = true; string myString = "Nocturne Studio.";
如果采用var关键字来定义,则可以写成如下的格式:
// Implicitly typed variables. var myInt = 0; var myBool = true; var myString = "Nocturne Studio.";
在这种情况下,编译器可以推断出myInt是System.Int32类型而myString是System.String类型,等等。使用GetType()方法可以获取它实际的数据类型
static void Main(string[] args) { // Implicitly typed variables. var myInt = 0; var myBool = true; var myString = "Nocturne Studio."; Console.WriteLine("The type of myInt is {0}", myInt.GetType().Name); Console.WriteLine("The type of myBool is {0}", myBool.GetType().Name); Console.WriteLine("The type of myString is {0}", myString.GetType().Name); Console.ReadLine(); }
输出的结果为:
var evenNumbers = new int[] { 2, 4, 6, 8 }; var myDoubles = new List<double>(); // 这里的int型数组evenNumbers还可以执行foreach语句进行迭代 foreach (var item in evenNumbers) { Console.WriteLine("Item value in evenNumbers: {0}", item); } // foreach里的item也可以用强类型int来指定,即写成 foreach (int item in evenNumbers) { Console.WriteLine("Item value in evenNumbers: {0}", item); }
隐式类型变量的一些限制
使用var关键字的时候还有些限制。首先,这种类型仅可以应用于方法或属性内部的局部变量,而不能用在字段、函数返回值和参数中。例如,下面的两个用法都是非法的:
class ErrorExamples { // var 不能用在字段中 private var myInt = 10; // var 不能用在返回值或参数的类型上 public var MyMethod(var x, var y) { } } // VS2008的编辑器都不会将var标蓝,用以提醒程序员。 另外,用var关键字声明的局部变量必须在声明的同时赋值,并且不能被赋予null。 //比如下面的做法都是错误的: // 错误,必须赋以初值 var myData; // 错误,必须在声明的同时赋值 var myInt; myInt = 0; // 错误,初值不能赋以null var myObj = null; // 正确,在赋初值之后再指向null var myDoubles = new List<double>(); myDoubles = null; // 正确,用已有的变量来赋初值 var myInt = 0; var myAnotherInt = myInt; 隐式类型数组 与局部变量相同地,可以定义隐式类型数组。演示如下: // 实际上是int[] var arrayA = new[] { 1, 2, 3, 4 }; // 实际上是double[] var arrayB = new[] { 1, 0.5, 3.14, 2.71828 }; // 实际上是string[] var arrayC = new[] { "Nocturne", null, "Studio", "SpadeQ" }; // 错误,不允许混合类型 var arrayD = new[] { 1, "one", 2, "two" };
目前看来,我还不是很清楚这项技术的具体应用,滥用这项技术肯定会对代码的可读性造成破坏。后面我会进一步去了解LINQ的相关资料,应该能够找到答案。 敬请期待 :-)
注意:本文来自Nocturne Studio的博客文章(http://blog.csdn.net/zqustc/article/details/1868276)