【问题标题】:What does "var" mean in C#? [duplicate]C#中的“var”是什么意思? [复制]
【发布时间】:2011-05-17 11:41:30
【问题描述】:

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

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

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

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

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

    MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
    

    变成

    var x = new MyReallyReallyLongClassName();
    

    但过度使用会牺牲可读性。

    【讨论】:

      【解决方案2】:

      这意味着被声明的本地的类型将由编译器根据其第一次赋值来推断:

      // This statement:
      var foo = "bar";
      // Is equivalent to this statement:
      string foo = "bar";
      

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

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

      var只有两种用途:

      1. 声明变量需要更少的输入,尤其是在将变量声明为嵌套泛型类型时。
      2. 在存储对匿名类型对象的引用时必须使用它,因为无法预先知道类型名称:var foo = new { Bar = "bar" };

      您不能将var 用作除本地人以外的任何类型。所以你不能使用关键字var 来声明字段/属性/参数/返回类型。

      【讨论】:

      • @cdhowie 如果说var foo = new Foo()foo 可以是Foo 类型或其任何超类。这怎么可能合法?
      • @Djack 这不合法,事实并非如此。 var foo = new Foo();Foo foo = new Foo(); 是一回事,这意味着foo 可以包含Foo 引用,或者对任何Foo 对象的引用sub 类型,not Foo 超级类型。
      【解决方案3】:

      “var”表示编译器将根据使用情况确定变量的显式类型。例如,

      var myVar = new Connection();
      

      会给你一个 Connection 类型的变量。

      【讨论】:

        【解决方案4】:

        你曾经讨厌编写这样的变量初始化器吗?

        XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
        

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

        var xmlSerializer = new XmlSerialzer(typeof(int))
        

        一个通知:类型在编译期间被解析,所以性能没有问题。但是编译器应该能够在构建步骤中检测类型,所以像var xmlSerializer; 这样的代码根本无法编译。

        【讨论】:

          【解决方案5】:

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

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

          var i = 53;
          

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

          int i = 53;
          

          请注意,虽然我们可以:

          long i = 53;
          

          var 不会发生这种情况。虽然它可以:

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

          同样:

          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.
          

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

          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,因为它们所拥有的类型没有名称。

          【讨论】:

            【解决方案6】:
            • 顾名思义,var 是没有任何数据类型的变量。
            • 如果您不知道任何方法会返回哪种类型的数据,这种情况下使用 var 比较好。
            • var 是隐式类型,这意味着系统将自行定义数据类型。编译器将根据“=”运算符右侧的值推断其类型。
            • int/string 等是由您明确定义的显式类型。
            • Var 只能在方法中定义为局部变量
            • 不能在单个语句中声明和初始化多个变量。例如,var i=1,j=2;无效。
            int i = 100;// explicitly typed 
            var j = 100; // implicitly typed
            

            【讨论】:

              【解决方案7】:

              var 是 C# 中的“上下文关键字”,这意味着您只能在使用该变量的同一类的上下文中隐式地将其用作局部变量。如果您尝试在从“Main”或其他外部类或接口调用的类中使用它,您将收到错误 CS0825 https://docs.microsoft.com/en-us/dotnet/csharp/misc/cs0825 >

              请参阅此处的文档中有关何时可以使用和不能使用它的备注:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed-local-variables#remarks >

              基本上,您应该只在声明具有隐含值的变量时使用它,例如“var myValue = “This is the value”;与说“字符串”相比,这可以节省一点时间,但恕我直言节省了大量时间,并限制了项目的可扩展性。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-11-18
                • 2015-04-20
                • 2019-09-12
                • 2016-11-12
                • 2011-03-07
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多