var是初始化一個匿名型別對象的專用關鍵字, 如果結合var和匿名型別, 在C#3.0中初始化一個匿名型別的對象是十分有個性的, 這樣的初始化方法讓當時剛接觸C#的我一直摸不清頭腦, 例如下面這個例子:
var myFriend = new {Name = "Tom", Sex = "male"};
這樣就初始化了一個匿名對象, 當然關鍵字var的引入, 背後是強大的編譯器做支援, 沒有顯式的型別宣告在程式啟動並執行時候就無法給這個類型的執行個體分配大小合適的記憶體! 比如這個例子在編譯的時候, 編譯器將建立一個含有兩個string成員的新匿名型別(第一個string成員是Name, 第二個string成員是Sex).
使用關鍵字var聲明變數
這個沒有多少好說的:
var i = 10; //與int i = 10 效果相同var s = "Tom"; //與string s = "Tom"效果相同//...
但這樣寫就是錯的:
var i = 10;i = "Tom";
因為在編譯的時候, 編譯器會進行"類型推演", 編譯器會識別出i是一個int型變數, 但下一行代碼圖謀將字串"Tom賦值給i, 顯然會編譯出錯. 其實Visual Studio已經很智能了, 不必等到編譯階段, 在IDE裡寫這兩行的時候就提示出錯了.
因此學會了var, 很多人可能喜歡聲明任何變數時都使用var關鍵字, 但回頭看看滿篇都是var關鍵字, 過了幾個月回頭看看代碼不能很直接的看出這個變數時什麼類型, 造成了代碼的可維護性變差了. 在<Linq技術詳解>P28作者是這麼說的:
為了獲得可維護的代碼, 不要因為使用var關鍵字方便, 就隨意使用這個關鍵字. 盡量在需要的時候再使用, 比如在講一個匿名型別的對象賦值給一個變數的時候.
很多時候變數類型的名字較長(如HttpWebRequest), 而且HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(XXX), 後面已經很明顯的進行強型別轉換了, 在這種情況下我用var聲明變數比較多