可能的重复:
var 关键字的意义何在?
C#中var关键字的使用
我了解IEnumerable<...>
数据类型如何使代码的可读性降低,或者嵌套泛型如何看起来有点令人生畏。但是除了代码可读性之外,使用 var 而不是显式类型有什么好处吗?似乎通过使用显式类型,您最好传达变量的功能,因为您知道它是什么。
如果它是工作场所编码标准,我会为了团队合作而使用它。然而,在我自己的项目中,我更喜欢避免使用 var。
可能的重复:
var 关键字的意义何在?
C#中var关键字的使用
我了解IEnumerable<...>
数据类型如何使代码的可读性降低,或者嵌套泛型如何看起来有点令人生畏。但是除了代码可读性之外,使用 var 而不是显式类型有什么好处吗?似乎通过使用显式类型,您最好传达变量的功能,因为您知道它是什么。
如果它是工作场所编码标准,我会为了团队合作而使用它。然而,在我自己的项目中,我更喜欢避免使用 var。
var 的重点是允许匿名类型,没有它它们就不可能,这就是它存在的原因。我认为所有其他用途都是惰性编码。
var
用作 foreach 块的迭代器变量比显式类型名称更安全。例如
class Item {
public string Name;
}
foreach ( Item x in col ) {
Console.WriteLine(x.Name);
}
此代码可以在没有警告的情况下编译,但仍会导致运行时转换错误。这是因为 foreach 循环同时适用于IEnumerable
和IEnumerable<T>
。前者返回类型为 asobject
的值,而 C# 编译器只是Item
为您进行转换。因此它是不安全的并且可能导致运行时错误,因为它IEnumerable
可以包含任何类型的对象。
另一方面,以下代码将仅执行以下操作之一
x
键入object
或其他类型没有名称字段/属性'x' 的类型将是object
和IEnumerable
的T
情况IEnumerable<T>
。编译器不进行强制转换。
foreach ( var x in col ) {
Console.WriteLine(x.Name);
}
我喜欢它,尤其是在单元测试中,因为随着代码的发展,我只需要修复声明/赋值的右侧。显然,我还必须更新以反映用法的变化,但在声明时我只需要进行一项更改。
它不会对发出的 IL 产生有意义的变化。它只是一种代码风格偏好。
一方面,我喜欢它,尤其是在处理具有长、通用、几乎不可读名称的类型时,例如Dictionary<string, IQueryable<TValue1, TValue2>>[]
.
这var
只是一个语法糖。在编译时总是知道变量是什么类型。使用 var 关键字没有其他优点。
没有任何真正的区别。有些人建议使用显式类型,因为它可以使维护代码更容易。然而,推动的var
人的立场是“如果我们使用 var,我们将被迫使用良好的命名约定”。
当然,如果您使用 vars 的目的是为了拥有良好的命名约定并且它会崩溃,那么它会更加痛苦。(海事组织)
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.
}
}
除了您提到的可读性方面,“var”还具有降低琐碎代码更改破坏代码其他部分的可能性的好处。例如,如果您重命名一个类型。或者,如果您切换到与前一种类型大部分兼容的不同类型(例如,从 Foo[] 更改为 IEnumerable),您需要做的工作就少得多,可以让您的代码恢复到可编译状态。
您可以抽象出技术细节的心理复杂性,以纯粹关注模型中的问题域。你必须确保你的变量被有意义地命名。