2013-09-06 2 views
1

Я считаю себя новым для CSharp. Я столкнулся с этой штукой, если код и не могу понять, что она делает.Что означает эквивалент типа EventHandler var для делегата в C#?

Я не видел enywhere, что EventHandler равно делегату? Что это делает? Конечно, ниже приведен фрагмент полного кода, так как я надеюсь, что для кого-то будет достаточно понимания общей концепции приравнивания обработчика событий к делегату. Благодарю.

public class xyz : ViewModelBase 
{ 
    protected EventHandler modelChanged = null; 
    public xyz ( int a, int b) 
    { 
     this.modelChanged = 
      delegate 
      { 
       // check for changes. 
       if (this.ChangesExist == false) 
       { 
        // set the flag 
        this.ChangesExist = true; 

        // append the title. 
        currentTitle += "*"; 

        _changeTitle(currentTitle); 
       } 

      }; 
    } 
} 
+2

«EventHandler» - это «делегат»: http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx – MarcinJuraszek

+1

Как раз в то же время, это не «приравнивание» в смысле сравнения, но на самом деле назначение переменной –

ответ

4

Я не видел enywhere, что EventHandler равно делегатом?

EventHandler является delegate type.

public delegate void EventHandler(
    Object sender, 
    EventArgs e 
) 

(. Атрибуты удалены для простоты)

В этом случае то, что вы видите, является anonymous method - способ создания делегата от «встроенного» блока кода. Lambda expressions являются более распространенным способом достижения этого в наши дни. (Анонимные методы были введены на C# 2, лямбда-выражения были введены на C# 3.) Как лямбда-выражения, так и анонимные методы могут быть преобразованы в экземпляры делегирования; некоторые лямбда-выражения также могут быть преобразованы в expression trees для кода, который должен анализировать логику в выражении.

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

+0

@ «Jon Skeet» Спасибо за ваш ответ. Я все еще переживаю это, все URL и т. Д. ...Я считаю, что это очень сложно понять, но я думаю, что как только я закончу читать их все и все их ссылки, я, вероятно, буду отмечать ваш ответ в качестве ответа. Это не интуитивный материал. – user1298925

+0

@ "Jon Skeet": Итак, что здесь происходит в этом коде? – user1298925

+0

@ user1298925: В вашем коде нет события, хотя это довольно необычно для «EventHandler». –

1

Если вы думаете об этом как о C/C++ modelChanged - это, по сути, указатель функции, на C# этот тип функций предоставляется делегатами. Есть несколько типов делегатов, и вы можете прочитать о них, если хотите, на msdn, но для краткости я не получу этого. По сути, вы объявляете EventHandler, который является типом делегата. Затем внутри xyz вы фактически определяете метод и назначаете его modelChanged. Позже в вашем коде, если вы вызываете modelChanged, это приведет к присвоению ему кода в xyz.

2

EventHandlerявляетсяdelegate с конкретной подписью:

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public delegate void EventHandler(
    Object sender, 
    EventArgs e 
) 

Если вы путать знак равенства, это не приравнивающей обработчик делегата, это назначение делегата к объекту modelChanged.

1

EventHandler - это просто тип делегата, объявленный микрософт, поэтому он может использоваться как любой другой делегат, вы можете иметь его экземпляр в своих классах и назначать реализацию с помощью анонимных делегатов, как в вашем коде. Это не лучшая практика, чтобы использовать его так, потому что у него есть специальная цель, предназначенная для него MS.

Смежные вопросы