【发布时间】:2020-12-15 00:50:08
【问题描述】:
请看下面的代码:
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 仍然为空 - 这是预期的。该列表应该包含对 myObject2 的引用,即使它为空。
但是,即使在我初始化 myObject2 之后,它在 myObject1 的 otherObjectsOfSameClass 列表中仍然为空。由于某种原因,该列表中的对象引用不会更新。有人可以解释这种行为吗?我在这里误解了一些基本的东西吗?
编辑:我意识到这可以用更简单的测试代码重现:
List<MyClass> myList = new List<MyClass> { myObject1, myObject2 };
myObject1 = new MyClass();
myObject1.TestMethod(); // works fine
myList[0].TestMethod(); // throws null reference exception
似乎将未初始化的对象添加到列表并随后对其进行初始化不会在列表中更改它 - 即使它应该通过引用而不是值添加...
【问题讨论】:
-
myObject2没有被初始化,所以你有myObject1.otherObjectsOfSameClass = new List<MyClass> { null };所以例外......即使你创建了一个你分配给myObject2之后,你在列表中有null。跨度> -
在您重新分配变量时,列表项和变量不再引用同一个对象。变量和列表保存值,有时这些值是引用。有时,两个变量、两个列表项或一个混合项具有相同的值,可以是对同一对象的引用。但重新分配一个不会影响另一个。
-
知道了。所以我只是在将它们添加到列表之前初始化这些对象,这是一个简单的修复。非常感谢你们。
标签: c# class object reference nullreferenceexception