C# C语言中的object和var差异#

C# C语言中的object和var差异#,c#,variables,object,var,C#,Variables,Object,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 您可以看到对象项应该装箱,而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
您可以看到对象项应该装箱,而var项不需要装箱

和的MSDN

  • 您还可以执行以下操作:

       object i;
       i = 2;
    
    但你不能这样做:

       var i;
       i = 2;
    
    您将得到编译错误

  • 对象是所有事物都在其中的类型 .Net继承自它,因此您可以 对于任何类型的y,对象x=y 因为继承,但是var是一个 隐式类型定义的关键字, 例如,var i=2表示int i= 二,
      • -未显式指定类型。让编译器找出那个类型是什么。
        • 类型在设计时是固定的,不能引用其他类型的对象
        • 正如
          Pauli
          在评论中指出的那样,您可以获得
          intelliSense
        • 必须初始化<代码>变量i无法编译
        • 不能用作方法的返回类型
        • 必须是局部变量。不是字段或属性
        • 这对你很有用。您将获得
          intelliSense
      • object
        -
        System.object

        • 可用于在运行时引用任何类型
        • 在这里,您无法获得
          intelliSense
      例子:
      您可以根据编译器确定的类型直接访问变量上的成员。。。在对象上,您没有遇到任何问题文本“对象将在运行时确定”不是真的(事实就是这样,您可能需要执行强制转换/强制操作才能使用它)。j的静态类型为
      object
      ,i的静态类型为
      int
      。在这种特殊情况下,
      objectj
      会隐式地将2“提升”到一个对象中(所有对象都是“引用类型”),但想象一下真正相同的语句:
      var i=(object)2;对象j=2
      。在这种情况下,运行时类型和信息是相同的。更准确地说,在:
      var s=“”;对象s2=“”对象类型是相同的——不同的是编译时/静态类型。@pst,我添加了Ildasm来澄清我所说的,总是有装箱和拆箱的问题,我这样说是为了那个,我认为@PauliØsterø,我的第一段说得比我的好。使用var时要记住的一点是,类型实际上就是您所做的任何赋值返回的类型。这意味着该代码将失败:var list=Enumerable.Range(0,10).OrderBy(i=>i);list=list.ToList();为什么?因为这里的var将被解析为IOrderedEnumerable,稍后您将尝试将IList分配给它。如果您从一开始就显式地将list设置为IEnumerable,那么一切都可以正常工作。
      
      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