Пустой делегат съест память?

public sealed class FtpManager
{
    public event EventHandler LoggingIn = delegate { };
    private void OnLoggingIn(object sender, EventArgs e)
    {
        var handler = LoggingIn;
        handler(sender, e);
    }
// ...
}

В вышеупомянутом коде я инициализировал LoggingIn обработчик событий с пустым делегатом.

Это будет влиять на пространство памяти, используемое всегда? Особенно, когда существуют сотни, или тысячи событий объявили такой путь?

9
задан dance2die 31 March 2009 в 20:54
поделиться

2 ответа

Поцарапайте предыдущий ответ (сохраненный ниже для потомства). Это зависит от реализации компилятора, но в соответствии с текущим компилятором 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;
}

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

14
ответ дан 4 December 2019 в 15:26
поделиться

Альтернатива выполнению этого проверяет LoggingIn на ничтожность каждый раз, когда Вы хотите повысить его. Это склонно быть более интенсивно использующим память, чем вызов пустого делегата.

-1
ответ дан 4 December 2019 в 15:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: