Почему конструктор EventArgs не защищен? - PullRequest
7 голосов
/ 27 мая 2011

Мне интересно, почему конструктор EventArgs не защищен, так как кажется пустым (хотя и крошечным) выделять ресурсы для пустого объекта для каждого события, особенно когда есть одноэлементный EventArgs.Empty, который явно более эффективен использовать. Это удивляет меня, особенно когда другие части .NET имеют защищенный / закрытый конструктор, чтобы избежать многократного, ненужного выделения, например Comparer<T>.

Есть ли случаи, когда создание new EventArgs() (не подкласса) действительно имеет смысл, или конструктор просто доступен для облегчения использования неопытным разработчикам?

Ответы [ 2 ]

6 голосов
/ 27 мая 2011

Я бы сказал, что это потому, что класс EventArgs имеет атрибут ComVisible, установленный на true.

. Это поддерживается следующим правилом FxCop :

Тип ссылки, который специально помечен как видимый для COM, содержит общедоступный параметризованный конструктор, но не содержит общедоступного конструктора по умолчанию (без параметров).

2 голосов
/ 27 мая 2011

Большой вопрос: «Зачем всегда использовать EventArgs, даже если вашему событию не нужна никакая информация?». Если бы EventArgs не имел публичного конструктора, вы бы не смогли этого сделать.

Хорошим преимуществом является то, что если в будущем вы захотите передать информацию, любой существующий код все равно будет скомпилирован. Например, следующий класс начинался с использования только EventArgs, но теперь передает строку, содержащую некоторую «полезную информацию».

class SomeEventSource
{
    public event EventHandler<SomeEventArgs> MyEvent;

    public void FireTheEvent()
    {
        MyEvent(this, new SomeEventArgs("This information is interesting"));
    }
}

class SomeEventArgs : EventArgs
{
    public SomeEventArgs(string interestingInformation)
    {
        InterestingInformation = interestingInformation;
    }
    public string InterestingInformation { get; private set; }
}

Этот код клиента был написан до изменения, но он все еще компилируется. Если бы оригинал не использовал EventArgs, то это изменение было бы более дорогим для реализации.

class SomeClient
{
    private readonly SomeEventSource _source;

    public SomeClient()
    {
        _source = new SomeEventSource();
        _source.MyEvent += source_MyEvent;
    }

    public void RunTest()
    {
        _source.FireTheEvent();
    }

    void source_MyEvent(object sender, EventArgs e)
    {
        // Do something
    }
}

Существует аннотация на конструкторе EventArg, которая позволяет оптимизировать его в определенных ситуациях. Сам EventArgs отмечен как Сериализуемый и ComVisible. Любой созданный вами подкласс воспользуется ими и будет соответствовать шаблону.

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