Разница между назначением метода Action <T>и подпиской на событие Action <T> - PullRequest
5 голосов
/ 13 февраля 2012

Допустим, у меня есть код ниже. В чем разница между назначением действий напрямую и подпиской на событие?

//Action directly assigned
public class ClassA
{
  public Action<string> OnAdd;

  private void SomethingHappened()
  {
     OnAdd("It Happened");
  }
}

public class ClassB
{

  public ClassB()
  {
    var myClass = new ClassA();
    myClass.OnAdd =  Add;
  }

  private void Add(string Input)
  {
    //do something
  }  
}

//Event handlers
public class ClassA
{
  public event Action<string> OnAdd;

  private void SomethingHappened()
  {
    if (OnAdd != null)
     OnAdd("It Happened"); //Should it be OnAdd.Invoke("It Happened") ???????
  }
}

public class ClassB
{

  public ClassB()
  {
    var myClass = new ClassA();
    myClass.OnAdd += Add;
  }

  private void Add(string Input)
  {
    //do something
  }  
}

Ответы [ 3 ]

10 голосов
/ 13 февраля 2012

(Кроме того, трудно объяснить вещи, когда вы дважды использовали одни и те же имена типов.)

Когда вы используете открытое поле, клиенты могут не только подписываться на события - они также могут полностью удалить другие обработчики событий, назначив вместо добавления:

myClass.OnAdd = Add;

Они также могут вызвать обработчик напрямую:

myClass.OnAdd("foo");

Оба изони нарушают обычный шаблон паб / суб, где различные подписчики изолированы друг от друга.Подписчики не могут перезаписывать подписки друг друга (только добавлять или удалять свои) и не могут сами инициировать событие.

Подробнее о событиях и делегатах см. мою статью отема .

2 голосов
/ 13 февраля 2012

Вы можете назначить более одного делегата одному событию (таким образом, оператор +=).

0 голосов
/ 13 февраля 2012

Событие действует как обертка вокруг Делегата, предлагая защиту от переназначения / удаления, как указал Джон. Я нашел это довольно хорошее чтение.

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