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