列表中的NULL对象即使在初始化后也保持为NULL



请查看下面的代码:

public class MainClass
{
MyClass myObject1, myObject2;
public MainClass()
{
myObject1 = new MyClass();
myObject1.otherObjectsOfSameClass = new List<MyClass> { myObject2 };
myObject2 = new MyClass();
myObject2.otherObjectsOfSameClass = new List<MyClass> { myObject1 };

myObject2.otherObjectsOfSameClass[0].TestMethod(); // works fine
myObject1.otherObjectsOfSameClass[0].TestMethod(); // throws null reference exception
}
}
class MyClass
{
public List<MyClass> otherObjectsOfSameClass;
public bool TestMethod()
{
return true;
}
}

我在这里试图实现的是存储几个MyClass类型的对象,这些对象包含对同一类型的其他成员的引用。当我初始化MainClass构造函数中每个对象的otherObjectsOfSameClass列表时,我会将另一个对象添加到该列表中。当我初始化myObject1时,myObject2仍然为null——这是预期的。该列表应该包含对myObject2的引用,即使它为null。

然而,即使在我初始化myObject2之后,它在myObject1的otherObjectsOfSameClass列表中仍然为null。由于某些原因,该列表中的对象引用不会更新。有人能解释一下这种行为吗?我是不是误解了一些基本的东西?

编辑:我意识到这可以用一个更简单的测试代码重现:

List<MyClass> myList = new List<MyClass> { myObject1, myObject2 };
myObject1 = new MyClass();
myObject1.TestMethod(); // works fine
myList[0].TestMethod(); // throws null reference exception

似乎将一个未初始化的对象添加到列表中并随后进行初始化不会改变列表中的对象——即使它应该通过引用而不是值来添加。。。

列表的变量和元素存储值。对于像MyClass这样的引用类型,该值要么是对对象的引用,要么是值null-无。

在工作情况下,

myObject2.otherObjectsOfSameClass = new List<MyClass> { myObject1 };

该列表包含变量myObject1存储的引用。myObject1存储对MyClass对象的引用,而不是null,因此该列表也存储对同一对象的引用。因此,当您访问该列表时,没有异常。注意,myObject1myObject2.otherObjectsOfSameClass[0]的值是不相关的。恰好它们的值是对同一对象的引用,但否则更改其中一个的值不会影响另一个。例如,执行:

myObject1 = null;

也不会使CCD_ 8为空。

OTOH,运行时:

myObject1.otherObjectsOfSameClass = new List<MyClass> { myObject2 };

myObject2存储null,因此列表存储null。同样,myObject2myObject1.otherObjectsOfSameClass[0]的值是不相关的。恰好它们都为空。然后你说:

myObject2 = new MyClass();

其将CCD_ 13的值改变为对对象的引用。这对myObject1.otherObjectsOfSameClass[0]的值没有影响。毕竟,它们是两个不同的变量。

这很有意义——当您在此时初始化myList = new List<MyClass> { myObject1, myObject2 };时,您正在创建一个新列表,该列表中的值将计算为null。稍后初始化myObject1或myObject2不会改变myList中存储有null的事实。

这是因为myObject1在实例化时为null-它没有指向的内存地址,也没有引用的对象。另一方面,如果您先初始化myObject1 = new someObject(),然后初始化myList,它将不会被定义,并且会引用myObject1,因此如果您更新myObject1则更新也会反映在myList

最新更新