在与同事讨论了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确实保持强类型,但问题是,在定义中不立即显示类型是否危险,当重载意味着当你无意中将错误的类型传递给方法时,编译器可能不会发出错误,这种情况会被放大。
摘自CodingHorror关于这一问题的文章:
不幸的是,你和其他人都错了。虽然我同意你的观点,冗余不是一件好事,但解决这个问题的更好方法应该是这样做:
MyObject m = new();
或者如果你传递参数:
Person p = new("FirstName", "LastName ");
在创建新对象时,编译器从左边推断类型,而不是右边。这比“var”有其他优点,因为它也可以在字段声明中使用(还有其他一些领域,它也可能有用,但我不会在这里讨论)。
最后,这并不是为了减少冗余。不要误解我,“var”在c#中对于匿名类型/投影是非常重要的,但是这里的使用是非常错误的(我已经说了很长很长一段时间了),因为你混淆了正在使用的类型。输入两次太频繁了,但是声明0次就太少了。
2008年6月20日上午08:00,c#mvp
我想如果你主要关心的是必须少打字——那么没有任何争论会动摇你使用它。
如果你只是一个查看代码的人,那么谁在乎呢?否则,在这种情况下:
var people = Managers.People
没关系,但在这种情况下:
var fc = Factory.Run();
它使我的大脑从代码的“英文”开始形成的任何即时类型推断短路。
否则,就用你最好的判断和编程“礼貌”来对待那些可能不得不为你的项目工作的人。
Var,在我看来,在c#中是一个很好的东西。任何这样类型的变量仍然是强类型的,但是它从赋值函数的右边得到它的类型。因为类型信息在右侧可用,在大多数情况下,也必须在左侧输入它是不必要的和过于冗长的。我认为这在不降低类型安全性的情况下显著提高了可读性。
From my perspective, using good naming conventions for variables and methods is more important from a readability perspective than explicit type information. If I need the type information, I can always hover over the variable (in VS) and get it. Generally, though, explicit type information shouldn't be necessary to the reader. For the developer, in VS you still get Intellisense, regardless of how the variable is declared. Having said all of that, there may still be cases where it does make sense to explicitly declare the type -- perhaps you have a method that returns a List<T>, but you want to treat it as an IEnumerable<T> in your method. To ensure that you are using the interface, declaring the variable of the interface type can make this explicit. Or, perhaps, you want to declare a variable without an initial value -- because it immediately gets a value based on some condition. In that case you need the type. If the type information is useful or necessary, go ahead and use it. I feel, though, that typically it isn't necessary and the code is easier to read without it in most cases.
var是处理匿名类型的方法,无论是否来自LINQ语句。任何其他用途在很大程度上取决于谁将阅读您的代码以及有哪些指导方针。
如果你是唯一的观众,或者你的观众对使用var很熟悉,或者非常熟悉你的代码,那么我想这没有关系。如果你像这样使用:var s = new SqlConnection(),那么这在很大程度上无关紧要,可能会提高代码的可读性。如果人们不太挑剔,他们可以做一些工作来了解不明显的类型(这在大多数情况下是不需要的,你在下面的语句中如何使用它通常会解释一切),那么它是好的。
但是如果你有挑剔的,思想封闭的队友,他们喜欢抱怨,或者如果你公司的设计准则特别禁止在类型不明显时使用var,那么你很可能会遇到强烈的反对。
如果使用var会让你的代码难以阅读,你可能会因为使用var而受到伤害,即使这可能是你的应用程序设计的问题。
如果var引入了歧义(有点像你的IEnumerable/IEnumerable例子),不要使用它,而是显式地使用它。但var确实有它的便利,在某些情况下,恕我直言,它甚至可以通过减少混乱来提高可读性。