Есть ли разница между следующими способами регистрации на событие - PullRequest
4 голосов
/ 11 августа 2009

Я хотел бы зарегистрироваться на какое-то событие. Работает следующие способы:

public void AddOptionAsListner(OptionElement option)
    {
        option.Selected += onOptionSelectedChanged;
    }

public void AddOptionAsListner(OptionElement option)
    {
        option.Selected += new EventHandler(onOptionSelectedChanged);
    }

Есть ли разница или это просто другой синтаксис для одной и той же вещи?

Ответы [ 3 ]

9 голосов
/ 11 августа 2009

То же самое - без различий. Компилятор определяет тип делегата и делает это автоматически для вас. Синтаксический сахар для облегчения вашей жизни

Только что проверил с C # -в глубине. Эта функция называется " Преобразование групп методов "; добавлено в C # 2.0

например. из книги

static void MyMethod() { ... }
static void MyMethod( object sender, EventArgs e) {...}

static void Main() {
    ThreadStart x = MyMethod;  // binds to first overload
    EventHandler y = MyMethod; // binds to second overload
}

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

    L_0000: ldnull 
    L_0001: ldftn void CS.Temp.Program::MyMethod()
    L_0007: newobj instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int)
    L_000c: pop 
    L_000d: ldnull 
    L_000e: ldftn void CS.Temp.Program::MyMethod(object, class [mscorlib]System.EventArgs)
    L_0014: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
    L_0019: pop 
3 голосов
/ 11 августа 2009

Это то же самое, новый EventHandler () просто избыточен.

Вам не нужно явно создавать делегат для обработчика событий.

0 голосов
/ 11 августа 2009

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

Вторая подпись автоматически генерируется для вас в Visual Studio, если вы используете «автоматический» (т. Е. Последовательность «вкладка, вкладка») при подписке на событие.

...