在与同事讨论了c# 3中var关键字的使用后,我想知道人们对通过var适当使用类型推断的看法是什么?

例如,我很懒地在有问题的情况下使用var,例如:-

foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

var更合法的用法如下:-

var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

有趣的是,LINQ似乎是一个灰色区域,例如:-

var results = from r in dataContext.SomeTable
              select r; // Not *entirely clear* what results will be here.

结果很明显,因为它将是一个实现IEnumerable的类型,但它并不完全明显,与var声明一个新对象的方式相同。

当涉及到对象的LINQ时,情况就更糟了,例如:-

var results = from item in someList
              where item != 3
              select item;

这并不比等价的foreach(var item in someList){//…}相当于。

这里有一个关于类型安全的真正问题——例如,如果我们将该查询的结果放在一个接受IEnumerable<int>和IEnumerable<double>的重载方法中,调用者可能会无意中传入错误的类型。

Var确实保持强类型,但问题是,在定义中不立即显示类型是否危险,当重载意味着当你无意中将错误的类型传递给方法时,编译器可能不会发出错误,这种情况会被放大。


当前回答

我认为人们不理解var关键字。 他们把它和Visual Basic / JavaScript关键字搞混了, 这完全是另一回事。

许多人认为var关键字意味着 弱类型(或动态类型),而实际上c#是并保持强类型。

如果你在javascript中考虑这个:

var something = 5;

你可以:

something = "hello";

在c#中,编译器会从第一条语句中推断出类型, 导致“int”类型的东西,因此会产生第二条语句 在异常中。

人们只需要明白,使用var关键字并不意味着 动态类型,然后决定var关键字的使用程度, 知道它对于将要编译的内容绝对没有区别。

当然var关键字的引入是为了支持匿名类型, 但如果你看这个:

LedDeviceController controller = new LedDeviceController("172.17.0.1");

这是非常非常冗长的,我相信这是一样可读的,如果不是更多:

var controller = new LedDeviceController("172.17.0.1");

结果是完全相同的,所以是的,我在我的代码中使用它

更新:

也许,只是也许……他们应该用另一个关键词, 那我们就不会有这样的讨论了……也许是“推断”关键字而不是“var”

其他回答

var很困难的一个具体情况是:离线代码审查,特别是在纸上完成的代码审查。

你不能依赖鼠标的移动。

我发现使用var关键字实际上使代码更具可读性,因为你只是习惯于跳过'var'关键字。当您真的不关心具体类型是什么时,您不需要一直向下滚动来弄清楚代码在做什么。如果我真的需要知道下面的“item”是什么类型,我只需将鼠标悬停在它上面,Visual Studio就会告诉我。换句话说,我更愿意读书

foreach( var item in list ) { DoWork( item ); }

一遍又一遍地

foreach( KeyValuePair<string, double> entry in list ) { DoWork( Item ); }

当我试图消化代码时。我认为这在某种程度上可以归结为个人喜好。在这一点上,我将依赖常识——在重要的方面(安全性、数据库使用、日志记录等)保留强制标准。

-工业。

我同意马特·汉密尔顿的观点。

当使用好的变量名时,Var可以使您的代码更具可读性和可理解性。但是,如果使用不当,var也会使您的代码像Perl一样难以阅读和理解。

一个var的好的和坏的用法列表也不会有太大的帮助。这是一个常识问题。更大的问题是可读性和可写性。许多开发者并不关心他们的代码是否具有可读性。他们只是不想打那么多。就我个人而言,我是一个读,写,写的人。

静态类型是关于契约的,而不是源代码。这里的想法是需要将静态信息放在“应该”是一个小方法的单行上。一般指南建议每个方法不要超过25行。

如果一个方法足够大,以至于您无法跟踪该方法中的单个变量,那么您做错了其他事情,这将使任何对var的批评相形见绌。

实际上,var的一个重要论点是它可以使重构更简单,因为你不再需要担心你的声明过于严格(例如,当你应该使用IList<>或IEnumerable<>时,你使用了List<>)。您仍然需要考虑新的方法签名,但至少不必返回并更改声明来匹配。

我尽可能使用var。

如果你的代码写得好,局部变量的实际类型并不重要(例如,良好的变量名,注释,清晰的结构等)。