【问题标题】:Difference in declaration: "var x = .." vs "var x; x = .."声明的差异:“var x = ..”与“var x; x = ..”
【发布时间】:2014-04-15 11:07:53
【问题描述】:

我是 C# 新手,请帮助我理解以下语句之间的区别:

var variable_name = new class_a(); // there is no error and is working fine

var variable_name; 
variable_name = new class_a(); // this line is throwing error

当我将语句重写为

class_a variable_name; 
variable_name = new class_a(); // this is working fine

【问题讨论】:

  • var keyword runtime or compile time? 可能会帮助您理解这一点。
  • 只是添加到现有的答案。 “var”有一个替代“动态”,它的类型在运行时动态解析。如果您尝试使用动态关键字的第二行,它将正常工作。但是动态类型会在一定程度上降低代码的可见性,并且不允许智能感知自动完成。

标签: c# variables


【解决方案1】:

var 用于引入implicitly typed local variable。该类型在编译时是已知的,并且是从初始化语句右侧的表达式类型推断出来的。使用您的示例:

var variable_name = new class_a();

编译器推断new class_a() 是一个产生class_a 类型对象的表达式。因此variable_name 被声明为class_a 类型。这段代码完全等价于

class_a variable_name = new class_a();

如果省略了初始化的右侧,则编译器无法推断类型。因此编译错误。

【讨论】:

    【解决方案2】:

    var 根据初始化变量的自动推断数据类型。

    var i = 3;    // 3 is an int; thus, i is declared as an int.
    

    在您的第二个示例中,没有指定值,因此无法推断。

    var i;        // no data type can be inferred
    

    【讨论】:

      【解决方案3】:

      当您使用var 时,您没有指定datatype,因此您应该为其分配一些值,以便var '变量' 变成那个datatype

      仅声明而不分配将无济于事,并且会在 var 的情况下引发错误。

      希望它能消除你的疑虑。

      【讨论】:

        【解决方案4】:

        因为var 推断类型并在编译时评估为静态类型声明,例如:

        var var_name; // The compiler does not know what type var is. It has not been inferred. Error!
        
        var var_name = new class_a(); // The compiler knows var has been inferred as class_a();
        

        相当于……

        class_a var_name = new class_a();
        

        下载 ILSpy,编译您的代码,使用 ILSpy 反映它,看看您的 var 声明会发生什么。

        【讨论】:

        • +1 表示编译时间,似乎没有人提到过
        【解决方案5】:

        编译器在为它分配一块内存时想知道变量的类型。第三行做它,然后给它一个值。第一行没问题,因为它在一行上,编译器知道变量应该是class_a 类型,它会分配内存并同时给出new class_a() 对象的值!
        但是第二个给你的错误是因为它会分配一个没有类型的内存!而且您不能将任何类型的任何对象放入该特定内存中!

        【讨论】:

          猜你喜欢
          • 2018-09-25
          • 2023-03-27
          • 2019-09-11
          • 2023-03-04
          • 2015-11-12
          • 2011-03-06
          • 1970-01-01
          • 1970-01-01
          • 2021-12-18
          相关资源
          最近更新 更多