关于c#:var关键字的确切用法是什么?

What is the exact use of var keyword?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Use of var keyword in C#

在与同事讨论了C 3中"var"关键字的使用后,我想知道人们对通过var进行类型推断的适当使用有什么看法?

例如,在有问题的情况下,我相当懒惰地使用var,例如:-

1
2
3
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.

VaR的更多合法用途如下:

1
2
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.

有趣的是,Linq似乎有点灰暗,例如:-

1
2
var results = from r in dataContext.SomeTable
               select r; // Not *entirely clear* what results will be here.

很明显,结果会是这样的:它将是一个实现IEnumerable的类型,但是它并不像声明新对象的var那样完全明显。

当涉及到对象的linq时,情况更糟,例如:-

1
2
3
var results = from item in someList
              where item != 3
              select item;

这并不比equivilent foreach(var item in someList) { // ... }的同类产品更好。

这里真正关心的是类型安全性——例如,如果我们将查询结果放入一个接受IEnumerableIEnumerable的重载方法中,调用方可能会无意中传入错误的类型。


就我个人而言,我发现您所描述的情况完全没有问题,因为重复自己没有意义,除非您特别希望变量的静态类型与用于初始化变量的表达式的静态类型不同。例如:

1
IEnumerable<int> foo = new List<int>(); // It's IEnumerable on purpose

此外,var绝对没有类型安全问题。重点不是变量可以是"任意"类型。它是一种非常特殊的类型,但是你根本不在乎把它拼出来。


据我所知,var仍然是强类型。编译器计算出正确的类型。事实上,它没有真正的意义。

这只是减少操作次数的一个技巧。例如,当您在一个类中更改类型时,这可能导致一系列修改。但它只是一种将工作从程序员迁移到编译器的方法。

例如,您的LINQ查询将产生一个IEnumerable类型。当您更改某个类以使结果为IEnumerable时,不需要更改代码的这一部分。


只需要一个"抽象"或"语法糖",就可以在不首先指定类型的情况下编写代码(这不是第一种情况)

在第二种情况下:用linq查询来获取一些未知的、动态的、非具体的(如果您愿意的话)类型。

可以是:

1
2
3
var results = from item in someList
              where item != 3
              select item; //item a class instance

可以是

1
2
3
 var results = from item in someList
              where item != 3
              select item.ItemName; //string property of that class

可以是

1
2
3
 var results = from item in someList
          where item != 3
          select new {item.ItemName, item.ID}; //unknown type dynamically generated, that conains the string and integer, like result

var关键字在语言中用作速记,但不是.NET类型。编译器必须知道使用var关键字的变量类型,因此它是类型安全的。

我个人只在类型名也用于分配并且名称可能太长而无法在代码中复制时使用它。

1
var dictionary = new Dictionary<string, string>();

它也用于匿名类型(但编译器必须知道匿名类型的签名)。

1
var fred = new { Age = 23, Name ="Fred" };

此方法通常用于LINQ查询的SELECT子句中。


在我确定要使用哪种数据类型之前,我只是将它用作位置保持器。

当然,这是一个简短的答案,但我认为当您应该使用var关键字时,这个答案非常接近。