1

我认为自己是 CSharp 的新手。我遇到了这个if代码,无法理解它的作用。

我还没有在任何地方看到 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);
                }

            };
    }
}
4

4 回答 4

4

我还没有在任何地方看到 EventHandler 等于委托?

EventHandler委托类型

public delegate void EventHandler(
    Object sender,
    EventArgs e
)

(为简单起见,删除了属性。)

在这种情况下,您看到的是一个匿名方法——一种从“内联”代码块创建委托的方法。不过,现在Lambda 表达式是一种更常见的实现方式。(C# 2 中引入了匿名方法;C# 3 中引入了 lambda 表达式。) lambda 表达式和匿名方法都可以转换为委托实例;一些 lambda 表达式也可以转换为表达式树,用于需要分析表达式中逻辑的代码。

如果您对委托比较陌生,您可能还想阅读我关于委托和事件的文章。

于 2013-09-06T18:59:28.027 回答
2

An具有特定签名的 a:EventHandler delegate

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

如果您对等号感到困惑,它并不是将处理程序等同于委托,而是委托分配给modelChanged属性。

于 2013-09-06T18:59:59.373 回答
1

如果您认为它就像 C/C++modelChanged本质上是一个函数指针,那么在 C# 中,这种类型的功能是通过委托提供的。有几种类型的代表,如果您愿意,可以在 msdn 上阅读它们,但为了简洁起见,我不会深入讨论。本质上,您是在声明一种EventHandler委托类型。然后在xyz你的内心实际上是在定义方法并将其分配给modelChanged. 稍后在您的代码中,如果您调用modelChanged它,将导致分配给它的代码xyz被执行。

于 2013-09-06T18:59:31.547 回答
1

EventHandler 只是 microsoft 声明的一种委托,因此它可以用作任何其他委托,您可以在您的类中拥有它的实例,并使用匿名委托来分配实现,就像在您的代码中一样。像这样使用它不是最佳实践,因为它有一些 MS 打算用于它的特殊目的。

于 2013-09-06T19:01:27.463 回答