#c# #vb.net #class #pass-by-reference
#c# #vb.net #класс #передача по ссылке
Вопрос:
У меня следующая проблема. Это простой пример некоторых имеющихся у меня классов (каждый из которых зависит от других классов).
public Class1()
{
public Class1(Class2 class2)
{
}
}
public Class2()
{
public Class2(Class3 class3)
{
}
}
public Class3()
{
public Class1 class1;
public Class3(Class1 class1)
{
this.class1 = class1;
}
}
Затем у меня есть следующий код, инициализирующий объекты.
Class1 class1 = null;
Class2 class2 = null;
Class3 class3 = null;
class3 = new Class3(class1);
class2 = new Class2(class3);
class1 = new Class1(class2);
Assert.IsNotNull(class3.class1)
Проблема, с которой я сталкиваюсь, заключается в том, что assert всегда равен null, даже если class1 был инициализирован. Одно условие, которое у меня есть, заключается в том, что я хочу, чтобы был создан только один экземпляр каждого класса.
Кто-нибудь может посоветовать лучший способ убедиться, что assert проходит.
Ответ №1:
class1 не инициализируется своим объектом при создании class3, поэтому его экземпляр class3 равен null.
Правильный способ выполнить этот тестовый проход -:
Class1 class1 = null;
Class2 class2 = null;
Class3 class3 = null;
class1 = new Class1();
class3 = new Class3(class1);
class2 = new Class2(class3);
class1.Class3 = class3;
Assert.IsNotNull(class3.class1)
Ответ №2:
class1
равно null при вызове:
class3 = new Class3(class1);
Поэтому, естественно, утверждение завершается ошибкой. Вам необходимо создать экземпляр class1, прежде чем пытаться передать его Class3
конструктору.
Теперь, это не тривиально достичь, поскольку у вас есть циклические ссылки. Поэтому вам нужно сначала создать объекты, а затем исправить ссылки. Отделите конструкцию от назначения ссылок на другие объекты.
Более того, вы не должны называть экземпляры объектов class
, поскольку они являются объектами, а не классами. Различие важно.
Ответ №3:
Изначально переменная class1 является нулевым указателем. Затем вы присваиваете ему некоторое значение, и ссылка изменяется. Но class3.class1 по-прежнему указывает на null.
вам нужно убедиться, что ссылка не меняется, но изменяется значение, на которое она указывает.
Комментарии:
1. да, @David Я забыл слово reference и использовал указатель, который кажется двусмысленным. Исправляю это: P