C#3.0中的var关键字

时间:2009-07-18 18:03:19

标签: c# .net visual-studio-2008 c#-3.0 var

  

可能重复:
  What’s the point of the var keyword?

大家好,

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

9 个答案:

答案 0 :(得分:17)

不,无论您是否使用LINQ,都可以使用var构建anonymous types

var anon = new { Name = "Anonymous", Age = 42 };

答案 1 :(得分:4)

使用这样的类型也更容易。如果您有非常长的泛型类型,那么类型名称可以在视觉上将变量名称识别为声明的一部分。

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

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

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

答案 2 :(得分:3)

来自msdn:

  

从Visual C#3.0开始,变量   在方法范围声明的可以   有一个隐式类型var。一个   隐式键入的局部变量是   强烈打字,就像你有   自己宣布了类型,但是   编译器确定类型。该   以下是我的两个声明   在功能上等同于:

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

MSDN Link Here

答案 3 :(得分:2)

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

实施例

var myObject = new MyObject();

VS

MyObject myObject = new MyObject();

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

实施例

var myAnon = new { Name = "Something", Count = 45 };

答案 4 :(得分:2)

除了LINQ查询,我在使用var关键字时会非常谨慎。有一个特定的例子,你只需要一个匿名类型,但这个很少,我认为很远。 Var会导致代码非常混乱,因为除非你使用intellisense拐杖,否则在阅读代码时你不知道你正在处理什么类型。

我越来越担心我看到如此多的片段和代码执行以下操作...它是懒惰的而不是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。

不要将它用作保存击键的捷径,下一个看你的代码的人会很感激。

答案 5 :(得分:1)

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

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

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

当然可以在LINQ查询之外以及内部使用。

答案 6 :(得分: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类型的不同之处。是的,无论如何,我会避免这样的声明。

答案 7 :(得分:0)

我相信在处理通过webservices等获得的数据时,它也会在WCF(Windows通信基金会)中使用。

答案 8 :(得分:0)

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