Можно ли ссылаться на «это» в конструкторе? - PullRequest
6 голосов
/ 23 февраля 2011

В C # распространенным шаблоном, который я использую, является заполнение деталей нижнего класса вычислений объектом формы.

Конструктор для MyForm:

MyForm()
{
   _MyFormCalcs = new MyFormCalcs(this);
}

Но сегодня я столкнулся с ошибкой, которая заставляет меня думать, что, поскольку мой конструктор не завершил выполнение, он создает новый экземпляр MyForm для передачи в MyData. Таким образом, он вызывает конструктор дважды. Я обнаружил, что статический список в MyFormCalcs заполнялся дважды, а во второй раз происходил сбой, поскольку ключи уже присутствовали в списке.

Могу ли я использовать это в конструкторе для ссылки на этот экземпляр? Что он будет содержать в низшем классе - был ли запущен конструктор или нет.

Как лучше передать мою форму в низший класс?

Ответы [ 4 ]

9 голосов
/ 23 февраля 2011

Нет, это не создаст новый экземпляр MyForm.

В общем, разрешение this "убежать" из конструктора является опасным , поскольку оно означаетможет использоваться до завершения конструктора, но он не будет создавать новый экземпляр.Если бы вы могли привести краткий, но полный пример проблемы, с которой вы столкнулись, мы могли бы помочь в ее дальнейшей диагностике.В частности, неясно, что вы имеете в виду под «статическим списком, который заполняется дважды».Обычно не рекомендуется заполнять переменную static в конструкторе instance .

2 голосов
/ 23 февраля 2011

На самом деле, очень приятно избегать такого вызова внутри конструктора, потому что ваш объект еще не построен (конструктор еще не завершил свою работу), но вы уже используете этот «незаконченный» объект в качестве параметра. Это плохой способ. Хороший способ - создать какой-то особый метод:

class MyClass
{

 var obj:SomeClass;

  public MyClass()
  {
  }

  public Init()
  {
    obj = SomeClass(this);
  }

}
1 голос
/ 23 февраля 2011

Создайте личное свойство, которое создает экземпляр MyFormCalcs только при первом его использовании, например:

public class MyForm {

  private MyFormCalcs MyFormCalcs {
    get {
      _MyFormCalcs = _MyFormCalcs ?? new MyFormCalcs(this);   
    }
  }
}

Таким образом, вам не нужно думать о том, когда нужно «инициализировать» вещи.

0 голосов
/ 23 февраля 2011

Это очень полный ответ порядка конструктора C #:

Порядок выполнения конструктора C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...