引用类型的未初始化vs空值引用类型变量未初始化和空值有区别吗?我在某处读到未初始化意味着null,但在其他地方我读到其他内容。谢谢!请注意,字段被隐式初始化为null,因此这只会影响变量。在纯c#中,您无法查询未初始化字段的值(您需要“明确赋值”),因此这不是问题。您可以通过滥用IL来做到这一点——通过声明out参数,并使用DynamicMethod编写不分配它的方法(在IL中有效,但在C#中无效)。然后你会发现你会看到null。这又是由于调用(C#)代码上的IL标志(.localsinit)表示“在进入此方法之前为我清除堆栈”。C#编译器总是设置这个标志。如果您再次滥用IL编写未设置此标志的方法,您可能会看到垃圾。它可以是任何东西。但是你应该得到你到目前为止得到的异常:)这是第一个例子(不是第二个,它更复杂):delegatevoidAbuseMe(outobjectfoo);staticvoidMain(){DynamicMethoddyn=newDynamicMethod("Foo",typeof(void),new[]{typeof(object).MakeByRefType()});dyn.GetILGenerator().Emit(OpCodes.Ret);AbuseMe方法=(AbuseMe)dyn.CreateDelegate(typeof(AbuseMe));对象对象;//这个**never**被赋值,通过**any**codemethod(outobj);Console.WriteLine(obj==null);只是为了澄清,DynamicMethod代码只是为这段代码编写的代码,这在C#中是不合法的:staticvoidFoo(outobjectwhatever){}//注意,whatever未分配这是有效的,因为out没有就CLR而言存在-仅参考。所以它不是无效的IL——只有语言(C#)可以赋予意义并要求它被赋予一个值。问题是Main()仍然有.locals初始化标志;所以在幕后obj被清除为空(好吧,整个堆栈空间被简单地擦除)。如果我在没有该标志的情况下从IL编译(并且有一些其他代码会弄脏堆栈空间),我会看到垃圾。您可以在LiranChen的博客上阅读有关.localsinit的更多信息。但要回答这个问题:“视情况而定”对于普通成员变量,如果在声明中没有指定值,则该变量将取相应的默认值(引用类型为null)。也就是说,classA{stringX;}类A{字符串X;}与类A相同{stringX=null;}类A{字符串X=null;}类A{字符串X=null;}.对于局部变量,在赋值之前访问证书是错误的。即使它们的类型“默认”为null(对于引用类型),默认情况下它们也不会隐式分配!即stringF(){stringx;返回x;}字符串F(){字符串x;返回x;}是一个编译时错误。记住:null就是null?以上就是C#学习教程的全部内容:引用类型非初始化vs空值共享。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
