可能重复:
var 关键字的意义何在?
大家好,
我想确认我的理解是否正确。如果我不使用 LINQ,那么使用 var 的唯一好处就是简洁?这是正确的理解吗?
不,您可以使用var
构造匿名类型,无论您是否使用 LINQ:
var anon = new { Name = "Anonymous", Age = 42 };
使用这样的类型也更容易。当您有很长的泛型类型时,类型名称可能会妨碍在视觉上将变量名称标识为声明的一部分。
Dictionary<string, Dictionary<int, ICollection<object>>>
特别是如果您返回并将其更改为
Dictionary<string, IDictionary<int, ICollection<object>>>
来自 msdn:
从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式类型 var。隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但编译器确定类型。i 的以下两个声明在功能上是等效的:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
如果您不使用 LINQ,则 var 允许您只声明变量的类型一次,而不是两次。
例子
var myObject = new MyObject();
对比
MyObject myObject = new MyObject();
这只能在本地完成,对于声明匿名类型也很有用。
例子
var myAnon = new { Name = "Something", Count = 45 };
除了 LINQ 查询,我在使用 var 关键字时会非常谨慎。当您只需要一个匿名类型时,有一些特定的实例,但我认为这很少见。Var 可能会导致代码非常混乱,因为除非您使用智能感知拐杖,否则您在阅读代码时不知道要处理的类型是什么。
我越来越担心我看到这么多代码片段和代码执行以下操作......它很懒,而不是 var 关键字的用途:
// Not too bad but still shouldn't be done because the only gain you have is keystrokes
var Something = new SomeObject();
// Type here is not obvious, are you getting an int, double, custom object back???
var Something = GetLengthOfSpaghettiCode();
所以将它用于 LINQ... 将其用于匿名类型(如果您确实在 LINQ 之外使用匿名类型,您应该仔细检查为什么需要这样做)。
引用MSDN(文章最后一行)关于使用 var 的内容:
但是,使用 var 至少有可能使其他开发人员更难以理解您的代码。因此,C# 文档通常仅在需要时才使用 var。
不要将其用作节省击键的捷径,下一个查看您的代码的人会欣赏它。
我不认为使用 var 应该是一个问题——我更喜欢它正是出于代码可读性的原因。首先, var 只是语法糖,在发出 IL 时会被编译为适当的类型。就代码可读性而言,关注变量的用途以及分配方式比仅仅关注其类型更有意义。VS .NET 编辑器无论如何都会在它后面的行中显示类型 - 如果你只是将鼠标悬停在它上面。所以这根本不应该是一个问题。就调试而言——如果你看到 Autos/Local/Watch 窗口——它们会显示所有成员的类型。
看到这样的代码对我来说更有意义:
var customers = GetCustomerList();
foreach (var customer in customers)
{
customer.ProcessOrders();
}
与
List<CustomerObjectDeserializedFromWebService> customers = GetCustomers();
foreach (CustomerObjectDeserializedFromWebService customer in customers)
{
customer.ProcessOrders();
}
var 公平地限于在局部变量声明中使用,这些声明也在声明时初始化。在那种情况下,如果您省略实际类型,它肯定会提高 IMO 的可读性。
编辑:我不警告以下用法是不公平的:
var x = 20;
情况不妙; 当字面量适用于多种类型时,您需要知道字面量的默认类型,从而了解从 x 的类型推断出的内容。是的,无论如何,我会避免这样的声明。
差不多,是的。var
只要编译器可以从您分配给它的任何值推断变量的类型,就可以使用它。(然而,类型推断规则相当复杂,因此您可能需要阅读 C# 规范以获得完整的理解。)
这并不完全正确,var
因为定义匿名类型需要关键字。例如:
var foo = new { abc = 1, def = 2 };
当然,它可以在 LINQ 查询之外和内部使用。
我还发现使用var还可以简化低耦合设计中的重构。这是因为我们倾向于使用强类型变量,但通常后面的代码会使用较弱的类型。使用var您将抵消编译器的类型更改。
我相信在处理通过 web 服务等获取的数据时,它也用于 WCF(Windows 通信基金会)。