似乎越来越多我读过的C#代码使用了 var 类型标识符:
foreach (var itemChange in ItemChanges)
{
//...
}
而不是明确说明类型:
foreach (ItemChange itemChange in ItemChanges)
{
//...
}
即使已知类型。
我仍在使用后者显式版本,因为我认为稍后阅读它会更快地了解变量的类型,而不是使用var。
但有没有技术理由使用其中一个?
答案 0 :(得分:21)
没有技术原因。如果在编译时无法推断出类型,则代码将无法编译。
你说得对,有些情况下最好使用显式类型来表示可读性,例如
var obj = SomeMethod(); // what's the type? you'd have to inspect SomeMethod()
SomeClass obj = SomeMethod(); // the type is obvious
但其他使用var的情况很有意义,例如
var obj = new SomeClass(); // the type is obvious
SomeClass obj = new SomeClass(); // the duplication of type is unnecessary
答案 1 :(得分:12)
不,只是可读性。
答案 2 :(得分:3)
一般没有技术原因。可读性 - 在任一方向 - 是唯一真正的因素。
然而,一个小警告是var
将推断变量的静态类型。如果你想要一个子类或超类类型,你需要自己进行投射。在foreach
的情况下,如您的示例所示,您通常可以通过使用子类类型声明循环变量来“免费”为您执行向下转换。
经典示例是迭代您知道的XML NodeList是XmlElement
的列表,但Nodelist
被列为XmlNode
的集合。当然你可以使用强制转换或as
来取回你想要的类型,但这似乎会破坏使用类型推断的目的: - )
当然,只要您尝试使用仅XmlElement
可用的节点成员,编译器就会让您知道这一点 - 因此它仍然不是严格意义上的技术差异。
另一件令人讨厌的事情是,如果你使用像Resharper这样的工具,那么建议你在每种可能的情况下使用var
都非常积极。如果它建议您将int
声明更改为var
,则会特别恼人!
但是,除非您关闭此功能,否则您使用var
的次数越多,Resharper的“噪音”就越小。
答案 3 :(得分:3)
我所知道的唯一技术原因是你可以在没有var
的情况下执行隐式强制转换,例如
int i = 5;
double a = i; // implicit cast with explicit types
但是在这里我更喜欢var
,因为它使得演员明确;虽然我不太在乎我在执行表示更改类型转换时所关注的类型:
var a = (double)i; // explicit cast with implicit types
但正如你所说,真正的一般原因是可读性。你需要问自己的问题是为什么你认为确切的具体类型对于可读性很重要?你总是写Linq查询调用具体类型,例如
from ItemChange itemChange in ItemChanges
// instead of
from itemChange in ItemChanges
同样,您是否总是调用泛型方法的类型参数,而不是使用类型推断,例如
ItemChanges.Select<ItemChange, ItemChange>((ItemChange itemChange) => ...);
// instead of
ItemChanges.Select(itemChange => ...);
或者你是否乐意让编译器为你做一些工作并让它解决这些类型,并且没有明确说明类型信息?
如果您对linq和泛型方法中的类型推断感到满意,那么您已经做出了一个决定,即你没有明确拼写出各种类型,并且你可能还没有找到你的代码。任何不太可读的结果(事实上,你可能发现恰恰相反)。所以使用var
只是你已经走过的另一条道路。
答案 4 :(得分:3)
var是一种C#3.0功能,仅在匿名类型
中是必需的因为遵循代码
var v = new { Amount = 108, Message = "Hello" };
动态创建新的匿名类型,var使用是必需的。例如,var在Linq中特别有用,其中类型通常是动态创建的。
在任何其他情况下,它只是最终应用程序的品味问题(它在编译期间得到解决)。但是对于代码阅读器,我认为“var”在信息类型方面的信息量较少。
答案 5 :(得分:2)
没有。使用var
可提高可读性,反之亦然。
答案 6 :(得分:2)
var是一个C#3.x +功能,不是吗?不使用它,您的代码也与其他版本更兼容。
当你搜索“var C#”
时,SO中有很多有趣的问题答案 7 :(得分:0)
在程序的任何给定状态下,除了匿名类型之外,没有技术上的理由使用var。
但是,使用var可以在不需要编辑程序的情况下更改程序。给定
public int SomeMethod(){}
public List<T> SomeOtherMethod<T>(T parameter);
然后
var x = SomeMethod();
var y = SomeOtherMethod(x);
会工作(并且y将是List<int>
)。如果您已经使用过
int x = SomeMethod();
List<int> y = SomeOtherMethod(x);
然后如果SomeMethod()
更改为返回long
,那么您必须更改y的定义。
我已经看到这种事情在整个程序中传播,需要进行数百次更改。特定情况是更改数据访问代码以返回ReadOnlyCollection<T>
而不是List<T>
。需要进行如此多的代码更改,我将List<T>
的所有显式提及更改为var,并且代码永远不需要再次更改。