当值设置为 null 时,幕后会发生啥?

Posted

技术标签:

【中文标题】当值设置为 null 时,幕后会发生啥?【英文标题】:What happens behind the scenes when a value is set to null?当值设置为 null 时,幕后会发生什么? 【发布时间】:2013-09-08 17:42:39 【问题描述】:

假设我有一个填充的对象数组。

 Resource[] list = new Resource[100000];

偶尔,我想将此列表中的一个对象更改为默认值。

 Resource defaultResource = new Resource();

稍后,我想检查该项目是否为默认项目。 所以,我想知道将列表对象设置为默认值与将值设置为 null 之间的性能差异可能是什么。

 list[i] = defaultResource; /*versus*/ list[i] = null;

所以说真的,我想知道当一个值设置为 null 而不是将其设置为其他值时,幕后发生了什么。

对不起,如果这是一个愚蠢的问题!

【问题讨论】:

【参考方案1】:

为您的方案考虑的一个可能选项 - 您希望不必编写空检查代码的简化。

考虑使用代表默认值的存根子类化您的 Resource 类。

public class NoResource : Resource  

// ... later

if (res is NoResource)  
  // handle default value

这样,您的代码仍然能够像预期的那样使用Resource 对象,并且您可以选择轻松地检查默认的Resource

【讨论】:

感谢您的建议,但它不太适合我的情况。【参考方案2】:

将变量设置为现有对象与将其设置为null 并没有太大区别。在这两种情况下,之前已被该变量引用的对象将更接近成为垃圾回收的条件,而不管该变量中存储的新值是 null 还是不同的对象。分配的其余部分也以相同的方式进行:CLR 不维护引用计数,因此在进行分配时不需要特别发生任何特殊情况。

存储一个默认对象来代替 null 可能是有益的,以避免在运行时进行大量的 null 检查:这样做可以简化代码,并减少在运行时进行分支的需要。

【讨论】:

以上是关于当值设置为 null 时,幕后会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

spring boot加mybatis使用Map返回时,当值为空时属性也会没有(转)

如果我总是在准备好的语句中使用 varchar 设置 null 会发生啥?

当 JDBC AutoCommit 为 False 且未设置显式事务边界时会发生啥

当我们设置 Xmx 和 Xms 大小相等时会发生啥

spring boot加mybatis使用Map返回值设置

设置 DisplayMember 时 DataGridViewComboBoxColumn 会发生啥?