C#中的隱式類型var——詳細示例解析
從 Visual C# 3.0 開始,在方法范圍中聲明的變量可以具有隱式類型var。隱式類型可以替代任何類型,它的具體類型由編譯器根據上下文推斷而出。
下面就讓我來總結下隱式類型的一些特點:
1.var類型會被編譯器根據初始值的類型推斷出具體的類型
eg:
var t="test";//var會被推斷為string類型
var p=new Person();//已知Person為一個已定義好的類,編譯完成後代碼會變成: Person p =new Person();
2.var類型的局部變量必須賦予初始值
eg:
var t=1;//正確,t會被推斷為int類型,值為1
var t;//報錯:隱式類型的局部變量必須已初始化
3.無法將null賦值給隱式類型的局部變量
eg:
var t=null;//報錯:無法將"<null>"賦予隱式類型的局部變量
4.var類型變量的定義必須是在方法中或者在屬性get、set訪問器中
eg:
復制代碼
public void Test()
{
var t="test";//正確
}
public string Name
{
get
{
var p = new Person();//正確
return p.Name;
}
}
class Program
{
var t = 1;//報錯:上下文關鍵字"var"只能出現在局部變量聲明中
}
復制代碼
5.var不能用作方法的參數
eg:
public void Test(var t){}//報錯:上下文關鍵字"var"只能出現在局部變量聲明中
6.不能當做返回值類型
eg:
public var Test(){}//報錯:並非所有代碼路徑都返回值 或者:上下文關鍵字"var"只能出現在局部變量聲明中
7.語句中只聲明一次變量,聲明後不能更改類型
eg:
var t="100";
t=100;//報錯:無法將類型"int"隱式轉換為"string"
8.初始化不能是一個匿名委托(也叫匿名方法、匿名函數)
eg:
var t = delegate(int i) { return i; };//報錯:無法將"匿名方法"賦予隱式類型的局部變量
9.可以用匿名類初始化
eg:
var person = new { Age = 18, Name = "Kobe" };//正確
//匿名類中的屬性一定要賦初始值,否則報錯
var person = new { Age, Name };//報錯:當前上下文中不存在"Age" 當前上下文中不存在"Name"
使用var定義變量和object不同,它在效率上和使用強類型方式定義變量完全一樣,因為還沒運行時編譯器就已經根據上下文推斷出是什麼類型了,所以要比object效率要高。善用隱式類型,在難以確定類型的情況下如將用於存儲匿名類型或匿名類型集合時使用會有奇效,在新語法中的使用頗多,是一把編程利器。