隱式類型變量的使用
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型變量,比如:
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" };
==============================8<------------------------------------------
目前看來,我還不是很清楚這項技術的具體應用,濫用這項技術肯定會對代碼的可讀性造成破壞。後面我會進一步去了解LINQ的相關資料,應該能夠找到答案。 敬請期待 :-)