可能重复:
What’s the point of the var keyword?
Use of var keyword in C#
我理解数据类型的IEnumerable<...>
如何使代码的可读性降低,或者嵌套的泛型看起来有点令人生畏。但除了代码可读性之外,使用var而不是显式类型是否有优势?看起来通过使用显式类型,您最好传达变量的功能,因为您知道它是什么。
如果它是工作场所编码标准,我会为了团队合作而使用它。然而,在我自己的项目中,我更愿意避免使用var。
答案 0 :(得分:18)
var的意思是允许匿名类型,没有它就不可能,这就是它存在的原因。我认为所有其他用途都是懒惰的编码。
答案 1 :(得分:8)
我喜欢它,尤其是在单元测试中,因为随着代码的发展,我只需要修改声明/赋值的右侧。显然我也必须更新以反映使用的变化,但在声明时我只需要进行一次更改。
答案 2 :(得分:8)
使用var
作为foreach块的迭代器变量比显式类型名称更安全。例如
class Item {
public string Name;
}
foreach ( Item x in col ) {
Console.WriteLine(x.Name);
}
此代码可以在没有警告的情况下编译,但仍会导致运行时转换错误。这是因为foreach循环适用于IEnumerable
和IEnumerable<T>
。前者返回类型为object
的值,C#编译器只为你引导到Item
。因此它不安全并且可能导致运行时错误,因为IEnumerable
可以包含任何类型的对象。
另一方面,以下代码只会执行以下操作之一
x
已键入object
或其他类型没有名称字段/属性在object
的情况下,'x'的类型为IEnumerable
,T
的情况为IEnumerable<T>
。编译器没有进行转换。
foreach ( var x in col ) {
Console.WriteLine(x.Name);
}
答案 3 :(得分:4)
它在发射的IL中没有产生任何有意义的变化。它只是一种代码风格偏好。
我喜欢它,特别是在处理具有Dictionary<string, IQueryable<TValue1, TValue2>>[]
等长,通用,几乎不可读的名称的类型时。
答案 4 :(得分:2)
var
只是一种语法糖。在编译时总是知道变量的类型。使用var关键字没有其他优点。
答案 5 :(得分:2)
没有任何真正的差异。有些人建议使用显式类型,因为它可以使代码维护更容易。但是,推动var
的人的立场是“如果我们使用var,我们就会被迫使用良好的命名约定”。
当然,如果你使用vars的目的是要有良好的命名约定并且会崩溃,那么在未来的道路上会更加痛苦。 (IMO)
答案 6 :(得分:1)
public IAwesome { string Whatever { get; } }
public SoCool : IAwesome { public string Whatever { get; } }
public HeyHey
{
public SoCool GetSoCool() { return new SoCool(); }
public void Processy()
{
var blech = GetSoCool();
IAwesome ohYeah = GetSoCool();
// Now blech != ohYeah, so var is blech and ohYeah is IAwesome.
}
}
答案 7 :(得分:0)
除了你提到的可读性方面,“var”还有一个好处,就是减少一个简单的代码更改会破坏代码的其他部分的可能性。例如,如果重命名类型。或者,如果切换到与前一种类型大多兼容的其他类型(例如,从Foo [更改为IEnumerable),那么将代码恢复到可编译状态的工作要少得多。
答案 8 :(得分:0)
您可以抽象出技术性的心理复杂性,将其完全集中在模型中的问题域上。你必须确保你的变量有意义地命名。