C#中的object和var区别
Posted
技术标签:
【中文标题】C#中的object和var区别【英文标题】:object and var difference in C# 【发布时间】:2011-05-28 02:28:14 【问题描述】: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 不需要装箱。
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的使用方法以及好处。
js中var a=new Object()和var a=有啥区别吗?