使用“?”使值类型变量可为空:是否意味着装箱?
Making value type variables nullable by using "?": does it imply boxing?
在 C# 中给出以下假设:
- 装箱和拆箱让我可以将任何值类型变量转换为对象类型,这是一种引用类型(因此它也可以为空),如示例所示:
int i = 123;
object box = i;
- 那个“?”运算符让我将不可为 null 的整数转换为可为 null 的变量,如示例所示:
int? n = 0;
我的问题:只有引用类型变量可以为空,我可以说在第二个示例中我正在做隐式装箱吗?换句话说,当我使用“?”运算符使可为空的整数时,是否存在装箱 操作也是隐含的(即使它不是明确的)?
int?
是 Nullable<T>
See documentation 的糖。如果我们看一下它的签名,我们会看到:
public struct Nullable<T> where T : struct
{
...
public override bool Equals(object other)
{
if (!this.hasValue)
return other == null;
return other != null && this.value.Equals(other);
}
因为它是一个结构,所以值不会被装箱。
如果您需要比较值,n.Equals(1)
会导致参数装箱。我找不到任何关于相等运算符 ==
的文档,但我认为假设它不应该导致装箱是相当安全的。
在 C# 中给出以下假设:
- 装箱和拆箱让我可以将任何值类型变量转换为对象类型,这是一种引用类型(因此它也可以为空),如示例所示:
int i = 123; object box = i;
- 那个“?”运算符让我将不可为 null 的整数转换为可为 null 的变量,如示例所示:
int? n = 0;
我的问题:只有引用类型变量可以为空,我可以说在第二个示例中我正在做隐式装箱吗?换句话说,当我使用“?”运算符使可为空的整数时,是否存在装箱 操作也是隐含的(即使它不是明确的)?
int?
是 Nullable<T>
See documentation 的糖。如果我们看一下它的签名,我们会看到:
public struct Nullable<T> where T : struct
{
...
public override bool Equals(object other)
{
if (!this.hasValue)
return other == null;
return other != null && this.value.Equals(other);
}
因为它是一个结构,所以值不会被装箱。
如果您需要比较值,n.Equals(1)
会导致参数装箱。我找不到任何关于相等运算符 ==
的文档,但我认为假设它不应该导致装箱是相当安全的。