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