请谨慎使用 C# 里的 var

我们都知道,比如 Swift 、 Python 里,都不需要特别的去声明一个变量的类型——它们虽然是类型安全的语言,却可以动态地在上下文中帮你推断变量的类型。

Python 不用你做什么,写一个名字就是默认声明了一个变量;而 Swift,则更接近我们的题目,它也使用了 var 。

如果你有过 Swift 的使用经验,再来使用 C# 的时候,就会发现这个 var  ,不再是那个 var 。

在 C# 里,你不能随随便便地使用 var,你只能在方法里使用它。

说起 var ,其实名称倒是一样的,都是 variable,都是变量的意思。之所以使用这个词,意思就是让你在大部分情况下不必再写出复杂的类型声明,只需要专注你的内容就好了,剩下的交给类型推断去完成。

不过在 C# 中,它对于这一点的支持比较保守。你不能像 Swift 一样,也不能像 Python 一样到处使用类型推断——C# 只允许你在局部变量上使用类型推断;也就是说,你只能在具体的方法里使用 var ,而对于类型属性的声明?还得老语法。

C# 的类型推断没你想象的那么聪明

在  MSDN 里,关于 var 的介绍页面很简单,只有几个简单的栗子——当然,在这些简单的情况下C#的类型推断运行良好。

但如果我要从 ListView 里获取一个 Item ,那么很遗憾,你将得到的不是 ListViewItem 实例,而很有可能是一个 object 。

之所以讲这个例子,是因为它困扰了我好久,最终才发现原来是 C# 的类型推断惹的祸。

类型推断让代码意义含糊不清?

另外,对于这个自 2008 年以来的功能,似乎使用的人不多,争论却不少,比如: C#争论:什么时候应该使用var?

我接触 C# 时间不长,但在var上踩的坑却不少。但用过 Python 和 Swift ,我丝毫不觉得类型推断会让代码的意义含糊不清,阅读起来也不会痛苦——相反,它让我写代码的时候更能够专注于内容——即“声明——使用”,而不是先去想想类型是什么。当我想到内容的时候,编译器就已经为我推荐了类型——大部分情况下都是合适的。

而 C# 呢?它仅仅保守地把类型推断用在了局部变量上——也感谢如此吧,不然这就应该算是灾难了。 C# 的类型推断总能恰到好处地避开我最想要的类型。所以我觉得,在 C# 里使用类型推断,不会让代码的意义含糊不清,而是让你根本不知道自己的变量类型被声明为什么……

——你根本不知道什么时候你的变量类型就被声明成了 object ,还沾沾自喜地使用了 ToString() 方法。

 

发布者:R0uter

如非声明,本人所著文章均为原创手打,转载请注明本页面链接和我的名字。

加入对话

1条评论

电子邮件地址不会被公开。 必填项已用*标注