public sealed class FtpManager
{
public event EventHandler LoggingIn = delegate { };
private void OnLoggingIn(object sender, EventArgs e)
{
var handler = LoggingIn;
handler(sender, e);
}
// ...
}
В вышеупомянутом коде я инициализировал LoggingIn
обработчик событий с пустым делегатом.
Это будет влиять на пространство памяти, используемое всегда? Особенно, когда существуют сотни, или тысячи событий объявили такой путь?
Поцарапайте предыдущий ответ (сохраненный ниже для потомства). Это зависит от реализации компилятора, но в соответствии с текущим компилятором C# 3.0 MS, это на самом деле только создает единственный экземпляр, который снова используется для каждого экземпляра. Это может сделать это, потому что делегаты неизменны, и тот делегат не запрашивает информации от экземпляра.
Я не знаю, имело ли это место с C# 2.0 все же. Можно декомпилировать код и видеть, использует ли IL на самом деле кэшируемое поле или нет. Используя ответ ниже безопасный способ гарантировать, что Вы только создадите один экземпляр все же.
Исходный ответ:
Да, это создает экземпляр делегата. Это возьмет некоторую память. Вы могли уменьшить это хотя:
public static class EventHandlers
{
public static readonly EventHandler Empty = delegate {};
}
public sealed class FtpManager
{
public event EventHandler LoggingIn = EventHandlers.Empty;
}
В той точке только будет один экземпляр, и можно обратиться к нему отовсюду. Оборотная сторона - то, что другие классы могли затем отказаться от подписки с помощью того же обработчика. При доверии остальной части кодовой базы, чтобы не сделать это, это - вероятно, лучший выбор с точки зрения памяти.
Альтернатива выполнению этого проверяет LoggingIn на ничтожность каждый раз, когда Вы хотите повысить его. Это склонно быть более интенсивно использующим память, чем вызов пустого делегата.