当前位置: 首页 > 知识库问答 >
问题:

对一般类型执行空检查是否会导致装箱?[副本]

唐永春
2023-03-14
class Command<T> : ICommand<T>
{
    public void Execute(T parameter)
    {
        var isNull = parameter == null;
        // ...
    }
}

t可以是任何类,甚至可以是null<>。如果t是值类型,执行上面的检查是否会导致装箱?我的理解是,这与调用referenceequals相同,后者接受两个object参数,如果t是值类型,如果我理解正确的话,这两个参数中的任何一个都会导致装箱。

如果上述情况确实导致装箱,是否有更好的方法来做到这一点而不导致装箱发生?我知道有default(T),但对于int,这是0,我希望查看这个值是否为null,而不对其进行装箱。此外,我希望以一种既满足值类型又满足引用类型的方式来实现这一点。

共有1个答案

云新知
2023-03-14

不--至少在我的理解中不是。如果t是非空值类型,则参数==null检查将由JIT编译器有效地替换为false;不执行执行时间检查。

这是一个只有JIT编译器才能执行的优化,因为C#编译器只生成一种形式的代码。例如,为示例生成的IL是:

IL_0000:  ldarg.1
IL_0001:  box        !T
IL_0006:  ldnull
IL_0007:  ceq

这看起来实际上执行了装箱--但我相信一个好的JIT编译器会发现,当t不可为空时,ceq总是给出一个假结果,并删除box操作。

 类似资料:
  • 我有一个操作/方法来执行对数据库的插入。它需要几个字段,由于各种原因,操作可能会失败,因为一个或多个输入不是唯一的,或者因为它们与一些需要唯一的内部记录冲突。 反对这种方法的人指出,我们开发团队知道会导致失败的每个错误情况,应该返回错误代码并使用它来处理每个情况。 我看不出检查方法有任何明显的缺点。这些错误情况很有可能发生,您绝对必须在使用saveUserInfo()的任何地方解决它们。似乎正是为

  • 我正在使用docker-compose在linux服务器(centos)中管理我的容器“abc”。 我想完成的步骤: 1)docker撰写拉abc以拉取我的最新图像 2)docker命令检查我的容器'abc'是否需要更新(可能???) 3) 如果我的容器是“abc”,我将执行docker编写up-d 备注:我知道第3步是检查并在必要时更新容器,但如果第2步返回True,我需要执行预任务

  • 问题内容: 由于该片段未装箱成原始类型,因此被称为是,所以抛出了一个片段。 甚至很容易看出您是否有如下代码段: 但是在像这样的更复杂的情况下更难实现: 那么Java编译器是否有可能因此而做出更舒适的Exception?我更喜欢这样的消息,例如 “您正在尝试将null对象转换为原始类型,这无法完成!” 这会更合适吗?你怎么看?在运行时甚至可能吗?我们能确定这个演员吗?我还没有看过Java字节码。也许

  • 我读过https://projectlombok.org/features/equalsandHashCode几次,从中得出了不同的结论。 下面是我正在做的一个例子来帮助澄清我的问题: GeneratorTypeB看起来与上面的代码段完全相同。现在说我有以下几点: 我用来组合集合的代码在这个设置中工作得很好,但是我要处理的数据很多,所以遇到equals方法中使用的重复的唯一标识符的几率很低,但是它

  • 这是我试图做的一个例子: 我注意到它在使用时对第二个自定义验证器进行验证 有没有一种方法可以添加多个验证模式,让proptypes使用在reactjs中签入?

  • 本文向大家介绍如何检查一个对象是否为空,包括了如何检查一个对象是否为空的使用技巧和注意事项,需要的朋友参考一下 检查一个数组为空很容易,直接调用 length 方法即可,那么如何检查一个对象是否为空呢 ❓ 这里的空指的是对象没有自有属性 假设这里有两个对象,一个是 obj 一个是 anotherObj 想了半天查看对象是否有 Symbol 属性只能使用 getOwnPropertySymbols