C#中“var”的含义是什么?


What does “var” mean in C#?

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

Possible Duplicate:
Use of var keyword in C#

在C中,关键字var是如何工作的?


这意味着编译器将推断声明的本地类型:

1
2
3
4
// This statement:
var foo ="bar";
// Is equivalent to this statement:
string foo ="bar";

值得注意的是,var没有将变量定义为动态类型。所以这是不合法的:

1
2
var foo ="bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints

var只有两种用途:

  • 声明变量需要较少的类型,尤其是将变量声明为嵌套的泛型类型时。
  • 在存储对匿名类型的对象的引用时必须使用它,因为类型名不能预先知道:var foo = new { Bar ="bar" };
  • 您不能将var用作除局部变量之外的任何类型。因此,不能使用关键字var来声明字段/属性/参数/返回类型。


    它意味着数据类型是从上下文派生的(隐含的)。

    来自http://msdn.microsoft.com/en-us/library/bb383973.aspx

    Beginning in Visual C# 3.0, variables
    that are declared at method scope can
    have an implicit type var. An
    implicitly typed local variable is
    strongly typed just as if you had
    declared the type yourself, but the
    compiler determines the type. The
    following two declarations of i are
    functionally equivalent:

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

    var可用于消除键盘输入和视觉噪声,例如:

    1
    MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();

    变成

    1
    var x = new MyReallyReallyLongClassName();

    但也可能被过度使用到牺牲可读性的程度。


    "var"表示编译器将根据用法确定变量的显式类型。例如,

    1
    var myVar = new Connection();

    会给你一个连接类型的变量。


    它根据初始化中分配给它的内容声明一个类型。

    一个简单的例子是,代码:

    1
    var i = 53;

    将检查53的类型,并将其重写为:

    1
    int i = 53;

    请注意,虽然我们可以:

    1
    long i = 53;

    这不会发生在VaR中。尽管它可以发生在:

    1
    var i = 53l; // i is now a long

    类似地:

    1
    2
    var i = null; // not allowed as type can't be inferred.
    var j = (string) null; // allowed as the expression (string) null has both type and value.

    对于复杂的类型,这可能是一个小的方便。匿名类型更重要:

    1
    2
    3
    var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
    foreach(var j in i)
      Console.WriteLine(j.ID.ToString() +":" + j.Name);

    这里没有其他方法可以定义ij,而使用var,因为它们所拥有的类型没有名称。


    你不喜欢写这样的变量初始值设定项吗?

    1
    XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))

    因此,从C 3.0开始,您可以将其替换为

    1
    var xmlSerializer = new XmlSerialzer(typeof(int))

    注意:类型是在编译期间解决的,所以性能没有问题。但是编译器应该能够在构建步骤中检测类型,所以像var xmlSerializer;这样的代码根本不会编译。