【问题标题】:object and var difference in C#C#中的object和var区别
【发布时间】:2011-05-28 02:28:14
【问题描述】:

objectvar 有什么区别?

【问题讨论】:

    标签: c# variables object var


    【解决方案1】:
    • var - 没有明确指定类型。让编译器弄清楚该类型是什么。
      • 类型在设计时是固定的,不能引用其他类型的对象。
      • 正如Pauli 在评论中指出的那样,您会得到intelliSense
      • 必须初始化。 var i; 不会编译。
      • 不能用作方法的返回类型。
      • 必须是局部变量。不是字段或属性。
      • Anonymous Types 配合得很好。你会收到intelliSense
    • object - System.Object.
      • 可用于在运行时引用任何类型。
      • 在这里你不会收到intelliSense

    示例:

    var i = 0; // i is of type `System.Int32`.  Same as "int i = 0;"
    i = "Some String"; // Compile time error.
    
    object o = 0;  
    o = "Some String"; // Works
    

    【讨论】:

      【解决方案2】:
      • 对象将在 运行时,但 var 确定 编译时间。

      例如:

      var i = 2;
      object j = 2;
      

      然后你在 ildasm 中查看它:

        IL_0000:  nop
        IL_0001:  ldc.i4.2
        IL_0002:  stloc.0
        IL_0003:  ldc.i4.2
        IL_0004:  box        [mscorlib]System.Int32
        IL_0009:  stloc.1
      

      您可以看到 object item 应该被装箱,而 var item 不需要装箱。

      objectvar 的 MSDN

      • 你也可以这样做:

           object i;
           i = 2;
        

        但你不能这样做:

           var i;
           i = 2;
        

        你会得到编译错误。

      • 对象是所有事物都在其中的类型 .Net 继承自它,所以你可以这样做 对象 x = y 对于任何类型的 y 因为继承,但 var 是 隐式类型定义的关键字, 例如 var i = 2 表示 int i = 2.

      【讨论】:

      • 您可以根据编译器确定的类型直接访问 var 上的成员...在您一无所获的对象上
      • 文本“对象将在运行时确定”不正确(它就是这样,您可能需要执行强制转换/强制才能使用它)。 j的静态类型是object,i的静态类型是int。在这种特殊情况下,object j 会将 2 隐式“提升”为一个对象(所有对象都是“引用类型”),但想象一下真正相同的语句:var i = (object)2; object j = 2。在这种情况下,运行时类型和信息是相同的。更准确地说,在:var s = ""; object s2 = ""; 中,对象类型相同——区别在于编译时/静态类型
      • @pst,我添加了 Ildasm 来澄清我所说的话,总是有一个装箱和拆箱问题,我为此说了这个,我认为 @Pauli Østerø,比我的第一个说得好段落。
      • 对于 var 还需要记住的一件事是,类型类型实际上是您所做的任何分配所返回的类型。这意味着此代码将失败: var list = Enumerable.Range(0, 10).OrderBy(i => i); list = list.ToList(); 为什么?因为这里的 var 将被解析为 IOrderedEnumerable 并且稍后您尝试将 IList 分配给它。如果您从一开始就明确地将 list 设置为 IEnumerable ,那么一切正常。
      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2017-04-08
      • 2011-09-08
      • 2012-01-17
      • 2018-08-02
      • 2012-07-19
      相关资源
      最近更新 更多