我们都知道,比如 Swift 、 Python 里,都不需要特别的去声明一个变量的类型——它们虽然是类型安全的语言,却可以动态地在上下文中帮你推断变量的类型。
Python 不用你做什么,写一个名字就是默认声明了一个变量;而 Swift,则更接近我们的题目,它也使用了 var 。
如果你有过 Swift 的使用经验,再来使用 C# 的时候,就会发现这个 var ,不再是那个 var 。
在 C# 里,你不能随随便便地使用 var,你只能在方法里使用它。
说起 var ,其实名称倒是一样的,都是 variable,都是变量的意思。之所以使用这个词,意思就是让你在大部分情况下不必再写出复杂的类型声明,只需要专注你的内容就好了,剩下的交给类型推断去完成。
不过在 C# 中,它对于这一点的支持比较保守。你不能像 Swift 一样,也不能像 Python 一样到处使用类型推断——C# 只允许你在局部变量上使用类型推断;也就是说,你只能在具体的方法里使用 var ,而对于类型属性的声明?还得老语法。
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 里,关于 var 的介绍页面很简单,只有几个简单的栗子——当然,在这些简单的情况下C#的类型推断运行良好。
但如果我要从 ListView 里获取一个 Item ,那么很遗憾,你将得到的不是 ListViewItem 实例,而很有可能是一个 object 。
之所以讲这个例子,是因为它困扰了我好久,最终才发现原来是 C# 的类型推断惹的祸。
类型推断让代码意义含糊不清?
另外,对于这个自 2008 年以来的功能,似乎使用的人不多,争论却不少,比如: C#争论:什么时候应该使用var?
我接触 C# 时间不长,但在var上踩的坑却不少。但用过 Python 和 Swift ,我丝毫不觉得类型推断会让代码的意义含糊不清,阅读起来也不会痛苦——相反,它让我写代码的时候更能够专注于内容——即“声明——使用”,而不是先去想想类型是什么。当我想到内容的时候,编译器就已经为我推荐了类型——大部分情况下都是合适的。
而 C# 呢?它仅仅保守地把类型推断用在了局部变量上——也感谢如此吧,不然这就应该算是灾难了。 C# 的类型推断总能恰到好处地避开我最想要的类型。所以我觉得,在 C# 里使用类型推断,不会让代码的意义含糊不清,而是让你根本不知道自己的变量类型被声明为什么……
——你根本不知道什么时候你的变量类型就被声明成了 object ,还沾沾自喜地使用了 ToString() 方法。
本文由 落格博客 原创撰写:落格博客 » 请谨慎使用 C# 里的 var
转载请保留出处和原文链接:https://www.logcg.com/archives/1722.html
涨知识了