2

可能重复:
var 关键字的意义何在?

大家好,

我想确认我的理解是否正确。如果我不使用 LINQ,那么使用 var 的唯一好处就是简洁?这是正确的理解吗?

4

9 回答 9

17

不,您可以使用var构造匿名类型,无论您是否使用 LINQ:

var anon = new { Name = "Anonymous", Age = 42 };
于 2009-07-18T18:07:32.323 回答
4

使用这样的类型也更容易。当您有很长的泛型类型时,类型名称可能会妨碍在视觉上将变量名称标识为声明的一部分。

Dictionary<string, Dictionary<int, ICollection<object>>>

特别是如果您返回并将其更改为

Dictionary<string, IDictionary<int, ICollection<object>>>
于 2009-07-18T18:07:50.467 回答
3

来自 msdn:

从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式类型 var。隐式类型的局部变量是强类型的,就像您自己声明了类型一样,但编译器确定类型。i 的以下两个声明在功能上是等效的:

var i = 10; // implicitly typed
int i = 10; //explicitly typed

MSDN 链接在这里

于 2009-07-18T18:14:08.927 回答
2

如果您不使用 LINQ,则 var 允许您只声明变量的类型一次,而不是两次。

例子

var myObject = new MyObject();

对比

MyObject myObject = new MyObject();

这只能在本地完成,对于声明匿名类型也很有用。

例子

var myAnon = new { Name = "Something", Count = 45 };
于 2009-07-18T18:08:07.737 回答
2

除了 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。

不要将其用作节省击键的捷径,下一个查看您的代码的人会欣赏它。

于 2009-07-18T18:18:51.193 回答
1

我不认为使用 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 的类型推断出的内容。是的,无论如何,我会避免这样的声明。

于 2009-07-18T23:50:27.483 回答
1

差不多,是的。var只要编译器可以从您分配给它的任何值推断变量的类型,就可以使用它。(然而,类型推断规则相当复杂,因此您可能需要阅读 C# 规范以获得完整的理解。)

这并不完全正确,var因为定义匿名类型需要关键字。例如:

var foo = new { abc = 1, def = 2 };

当然,它可以在 LINQ 查询之外和内部使用。

于 2009-07-18T18:09:26.063 回答
0

我还发现使用var还可以简化低耦合设计中的重构。这是因为我们倾向于使用强类型变量,但通常后面的代码会使用较弱的类型。使用var您将抵消编译器的类型更改。

于 2009-07-18T19:35:23.567 回答
0

我相信在处理通过 web 服务等获取的数据时,它也用于 WCF(Windows 通信基金会)。

于 2009-07-18T18:07:56.957 回答