gpt4 book ai didi

c# - 基于可为空类型的对象仅在对象为非空时才装箱

转载 作者:太空狗 更新时间:2023-10-30 00:23:53 25 4
gpt4 key购买 nike

我创建了一个简单的 C# 程序:

class Program
{
static void Main(string[] args)
{
Int32? a = null;
object x = a;
}
}

根据 MSDN:

Objects based on nullable types are only boxed if the object is non-null. If HasValue is false, the object reference is assigned to null instead of boxing.

我在 ILDASM 中尝试了我的可执行文件,发现 IL 代码调用了 box 方法。

.method private hidebysig static void  Main(string[] args) cil managed
{
.entrypoint
// Code size 17 (0x11)
.maxstack 1
.locals init ([0] valuetype [mscorlib]System.Nullable`1<int32> a,
[1] object x)
IL_0000: nop
IL_0001: ldloca.s a
IL_0003: initobj valuetype [mscorlib]System.Nullable`1<int32>
IL_0009: ldloc.0
IL_000a: box valuetype [mscorlib]System.Nullable`1<int32>
IL_000f: stloc.1
IL_0010: ret
} // end of method Program::Main

我的问题是:为什么叫它?也许我做错了什么或误解了什么?

最佳答案

试图装箱一个值并不意味着它实际上是装箱的值 - x 将是 null,而不是装箱的 null。我认为 MSDN 正试图解释这一点:

Int32? a = null;
object x = a;
object y = a;
object.ReferenceEquals(x, y); // true

但是:

Int32? a = 3;
object x = a;
object y = a;
object.ReferenceEquals(x, y); // false

至于在 Release模式下编译 - 它可能不会尝试装箱值,因为在编译时已知 anull - 如果 a 是公共(public)方法的参数,它可能总是尝试装箱该值(但永远不会真正装箱 null)。

关于c# - 基于可为空类型的对象仅在对象为非空时才装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com