关于C#中事件与委托区别的一个疑问

大漠刀客
  • 185

网上说C#中的事件是封装过的委托,那么为什么这里是

HandEvent += Method;

而不是

HandEvent handevent += Method;

委托是一种类吧,事件是封装后的类,那为什么没有实例化?静态类感觉也不是。
这里的事件 HandEvent应该是一种属性吧,并且带有访问器remove, add。

  public delegate void InvokeMethond(string str);
    public delegate void Handler(string str);
    class Program
    {
        static event Handler HandEvent;
        static void Main(string[] args)
        {
            InvokeMethond invokeMethond = Method;
            HandEvent += Method;
            invokeMethond("委托");
            HandEvent("事件");
        }
        public static void Method( string str )
        {
            Console.WriteLine(" 字符串: {0}", str);
        }
    }
回复
阅读 2.3k
1 个回答
边城
  • 53.6k

从本质上来说,下面这两句话没区别,都是定义一个 string => void 的委托

public delegate void InvokeMethond(string str);
public delegate void Handler(string str);

从使用上来看,区别就在于:委托要赋初始值,而事件不用

Handler h1;
h1 += s => Console.WriteLine(s);   // ⇐ 这里报错,因为 h1 未赋值(未实例化)

Handler h2 = s => Console.WriteLine(s); // OK

委托是个类型,但事件不同,它是一个成员。

static event Handler h3;

//...
h3 += s => Console.WriteLine($"3 - {s}");   // OK

这说明,在使用 h3 的时候,它已经实例化了,是一个事件对象(成员)。

委托和事件的关系,就像类型和变量之间的关系差不多。上网搜一下“事件与委托的关系”或者类似的关键字,会找到更多有助于理解的信息。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏