Передача объектов в конструктор перед инициализацией

#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