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

时间:2013-09-05 02:56:07

标签: c# null assignment-operator

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

 Resource[] list = new Resource[100000];

有一段时间,我想将此列表中的对象更改为默认值。

 Resource defaultResource = new Resource();

稍后,我想检查该项目是否为默认值。 所以,我想知道将列表对象设置为默认值时的性能差异,而不是将值设置为null。

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

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

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

2 个答案:

答案 0 :(得分:4)

将变量设置为现有对象与将其设置为null之间没有太大区别。在这两种情况下,无论存储在该变量中的新值是null还是不同的对象,之前该变量引用的对象都会更接近于有资格进行垃圾回收。分配的其余部分也是以相同的方式进行的:CLR不保持引用计数,因此在进行赋值时,不需要特别发生任何特殊情况。

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

答案 1 :(得分:1)

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

考虑使用表示默认值的存根对您的Resource类进行子类化。

public class NoResource : Resource { }

// ... later

if (res is NoResource) { 
  // handle default value
}

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