我們都知道,比如 Swift 、 Python 裡,都不需要特別的去聲明一個變量的類型——它們雖然是類型安全的語言,卻可以動態地在上下文中幫你推斷變量的類型。
Python 不用你做什麼,寫一個名字就是默認聲明了一個變量;而 Swift,則更接近我們的題目,它也使用了 是 。
如果你有過 Swift 的使用經驗,再來使用 C# 的時候,就會發現這個 是 ,不再是那個 是 。
在 C# 裡,你不能隨隨便便地使用 var,你只能在方法裡使用它。
說起 是 ,其實名稱倒是一樣的,都是 變量,都是變量的意思。之所以使用這個詞,意思就是讓你在大部分情況下不必再寫出複雜的類型聲明,只需要專注你的內容就好了,剩下的交給類型推斷去完成。
不過在 C# 中,它對於這一點的支持比較保守。你不能像 Swift 一樣,也不能像 Python 一樣到處使用類型推斷——C# 只允許你在局部變量上使用類型推斷;也就是說,你只能在具體的方法裡使用 是 ,而對於類型屬性的聲明?還得老語法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class ChatWindow : Form { var coreData = CoreData.getCoreData(); //error string selectedUser = ""; Dictionary<string,User> users = new Dictionary<string,User>(); public ChatWindow() { InitializeComponent(); loadContacts(); var foo = "bar"; //pass } ... } |
C# 的類型推斷沒你想像的那麼聰明
在 MSDN 裡,關於 是 的介紹頁面很簡單,只有幾個簡單的栗子——當然,在這些簡單的情況下C#的類型推斷運行良好。
但如果我要從 列表顯示 裡獲取一個 項目 ,那麼很遺憾,你將得到的不是 的ListViewItem 實例,而很有可能是一個 目的 。
之所以講這個例子,是因為它困擾了我好久,最終才發現原來是 C# 的類型推斷惹的禍。
類型推斷讓代碼意義含糊不清?
另外,對於這個自 2008 年以來的功能,似乎使用的人不多,爭論卻不少,比如: C#爭論:什麼時候應該使用var?
我接觸 C# 時間不長,但在var上踩的坑卻不少。但用過 Python 和 Swift ,我絲毫不覺得類型推斷會讓代碼的意義含糊不清,閱讀起來也不會痛苦——相反,它讓我寫代碼的時候更能夠專注於內容——即“聲明——使用“,而不是先去想想類型是什麼。當我想到內容的時候,編譯器就已經為我推薦了類型——大部分情況下都是合適的。
而 C# 呢?它僅僅保守地把類型推斷用在了局部變量上——也感謝如此吧,不然這就應該算是災難了。 C# 的類型推斷總能恰到好處地避開我最想要的類型。所以我覺得,在 C# 裡使用類型推斷,不會讓代碼的意義含糊不清,而是讓你根本不知道自己的變量類型被聲明為什麼……
——你根本不知道什麼時候你的變量類型就被聲明成了 目的 ,還沾沾自喜地使用了 的ToString() 方法。
本文由 落格博客 原創撰寫:落格博客 » 請謹慎使用 C# 裡的 var
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1722.html
漲知識了