Почему это событие Action не имеет значения? - PullRequest
3 голосов
/ 15 июля 2011

В настоящее время у меня есть 2 WinForms.

FormA создает экземпляр FormB .Я вызываю ShowDialog () метод FormB .

FormB определяет public event Action<SomeClass, string> Analyze

Когда я нажимаю1018 * ProcessEvent кнопка FormB Я делаю следующее:

Action<SomeClass, string> tempAction = Analyze;
if (tempAction != null)
{
  tempAction.Invoke(instanceOfSomeClass, someString);
}

Но событие не вызывается, потому что tempAction равно нулю.

Почему это будет нулевым?

Я определяю события таким же образом в FormA , и они работают нормально.

EDIT:

У меня есть класс докладчика, который подписывается на событие:

formBInstance.Analyze += StartAnalyze

Ответы [ 2 ]

6 голосов
/ 15 июля 2011

вы должны подписаться на событие. Если подписчиков нет, анализ будет нулевым

FormB form = new FormB();
form.Analyze += OnAnanlyze; // define callback function
2 голосов
/ 15 июля 2011

Другие ответили на ваш оригинальный вопрос. Я просто собираюсь добавить несколько моментов, которые вы должны рассмотреть.

Инициализатор событий

Прежде всего, вы можете использовать `делегат {} ´ как инициализатор для всех событий, чтобы иметь возможность пропустить нулевую проверку, а также чтобы сделать ваши события безопасными.

Пример:

public class MyClass
{
    public event EventHandler<TempActionArgs> TempAction = delegate {};
}

Таким образом, вы можете вызвать его, просто используя

TempAction(this, new TempActionArgs(someStrings);

Никаких проверок не требуется.

Использование стандартного механизма событий

Не используйте Action<> для событий. Используйте стандартный механизм EventHandler / EventArgs, чтобы приложение выглядело как любое другое приложение .NET. imho Action<> следует использовать только для временного вызова (а не во время жизни объектов). Методы LINQ являются прекрасным примером.

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