Регистрация событий внутри конструктора? - PullRequest
6 голосов
/ 09 декабря 2011

Я играл с делегатами, событиями и анонимными методами. При этом один момент стал очень ясным.

Разве это не упростит процесс регистрации каких-либо методов событий или функций-делегатов в конструкторе?

Мои тесты показывают, что это работает, и это не позволяет вам объявлять их после создания экземпляра (как конструктор объекта делает это за вас).

На самом деле производительность довольно хорошая. Есть ли какие-либо недостатки использования ключевого слова this для ссылки на текущий объект при создании / создании объекта?

Это, кажется, имеет большой смысл для меня, так как все события будут связаны с созданием экземпляра.

Есть ли области, в которых это может быть проблемой?

Пример:

//Constructor
public SayHello() 
{
  _name = "Unnamed";
  _isUpdated = false;

  // Register event handler via lambda (ananymous method shorthand)
  this.NameChanged += (object sender, EventArgs e) => { Console.WriteLine(e.message)); };
}

Ответы [ 2 ]

15 голосов
/ 09 декабря 2011

Есть несколько потенциальных проблем с этим подходом. Во-первых, с более общей стороны, как правило, следует предпочитать использовать переопределения методов, а не подписываться на самоопубликованные события по соображениям производительности. Очевидно, что это невозможно, если событие предоставляется классом, основанным на внешнем источнике, который предоставляет событие без соответствующего переопределяемого метода. Однако подписка на самостоятельно опубликованные события должна быть последним средством, а не подходом по умолчанию.

Вторая потенциальная проблема является более серьезной, но она связана с тем, что делает код, вызванный событием, а не с тем, какой объект предоставляет событие. Например, рассмотрим следующий конструктор:

public Foo(Bar bar)
{
    bar.SomeEvent += (s, e) => this.DoSomething();
}

Если bar запускает SomeEvent в другом потоке, метод DoSomething экземпляра Foo может быть вызван до полной инициализации экземпляра. Это довольно хорошо задокументированная проблема в пространстве Java (см., Например, http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html),, но охват для C # / .NET гораздо более редкий. http://joeduffyblog.com/2010/06/27/on-partiallyconstructed-objects/ обеспечивает некоторое подробное покрытие для .NET, но это может быть больше, чем вы хотели знать ...

1 голос
/ 09 декабря 2011

Я не думаю, что есть какие-либо проблемы.Это зависит от вас, чтобы сделать это таким образом.Вы можете использовать сам объект в его конструкторе.Это бы тоже сработало, если вы опустите this.

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