C#中的object和var区别

Posted

技术标签:

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

objectvar 有什么区别?

【问题讨论】:

【参考方案1】: var - 没有明确指定类型。让编译器弄清楚该类型是什么。 类型在设计时是固定的,不能引用其他类型的对象。 正如Pauli 在评论中指出的那样,您会得到intelliSense。 必须初始化。 var i; 不会编译。 不能用作方法的返回类型。 必须是局部变量。不是字段或属性。 与Anonymous Types 配合得很好。你会收到intelliSenseobject - 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 不需要装箱。

object 和 var 的 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 ,那么一切正常。

以上是关于C#中的object和var区别的主要内容,如果未能解决你的问题,请参考以下文章

c#中的var关键字和object关键字的区别,顺便介绍下object的使用方法以及好处。

Javascript和C#中var实现的区别

js中var a=new Object()和var a=有啥区别吗?

“C++ void Pointer”和“C# var”之间的区别

动态(C# 4)和 var 有啥区别?

js中var a=new Object()和var a={}有什么区别吗?