当前位置:编程学习 > C#/ASP.NET >>

C# EventHandler 委托不使用继承EventArgs约定参数为嘛不会报错?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("多播委托");
            Action<string> Delegete = Method1;
            Delegete += Method2;
            Delegete += Method1;
            Delegete += Method1;
            Delegete -= Method2;
            Console.WriteLine("Start");
            Delegete("Test");

            ReleaseEvent GTAYY = new ReleaseEvent();
            MonitorEvent YiYin = new MonitorEvent("YiYin");
            MonitorEvent Niok = new MonitorEvent("Niok");
            MonitorEvent JoeZhao = new MonitorEvent("JonZhao");

            GTAYY.Event += YiYin.Event;
            GTAYY.Event += Niok.Event;
            GTAYY.Event += JoeZhao.Event;
            GTAYY.TriggerEvent("BBS SB");
            GTAYY.Event -= YiYin.Event;
            GTAYY.TriggerEvent("ABS ACC");

            Console.ReadLine();
        }

        public static void Method1(string text)
        {
            Console.WriteLine("Method 1 = " + text);
        }

        public static void Method2(string text)
        {
            Console.WriteLine("Method 2 = " + text);
        }
    }

    class EventInfo //: EventArgs 加不加都一样
    {
        public string EventName { get; set; }

        public EventInfo(string eventName)
        {
            EventName = eventName;
        }
    }

    class ReleaseEvent//事件发布者
    {
        public event EventHandler<EventInfo> Event;

        public void TriggerEvent(string eventName)
        {
            Console.WriteLine("Trigger Event");
            if (Event != null)
            {
                Event(this, new EventInfo(eventName));
            }
        }
    }

    class MonitorEvent//事件监听者
    {
        private string Name { get; set; }

        public MonitorEvent(string name)
        {
            Name = name;
        }

        public void Event(object sender, EventInfo e)
        {
            Console.WriteLine(Name + ":" + "You have a New Event *" + e.EventName);
        }
    }

}


书上说  EventHandler<TEventArgs> 委托 有2个参数 
第一个参数是一个对象,作为事件的发布者
第二个参数提供事件的相关信息,TEventArgs约束为继承自基类EventArgs但是我的EventInfo貌似继承不继承无所谓呀 = = 这个约束到底体现在那里
我用的是.NetFramework 4.5 莫非改了 =-=
我有点晕哈,小弟正在学C# 问题多有幼稚多多包涵 =-=
--------------------编程问答--------------------
引用 楼主 YYATG 的回复:
书上说  EventHandler<TEventArgs> 委托 有2个参数 
第一个参数是一个对象,作为事件的发布者
 第二个参数提供事件的相关信息,TEventArgs约束为继承自基类EventArgs但是我的EventInfo貌似继承不继承无所谓

哪本书这样写?公布一下作者的名字!

根本没有什么“约束”。 --------------------编程问答-------------------- 谁说一定 要用 EventArgs类型了,你随便,爱穿啥穿啥 --------------------编程问答-------------------- MSDN里面确实有

http://msdn.microsoft.com/zh-cn/library/vstudio/db0etb8x.aspx

否则,第二个参数为从 EventArgs 派生的自定义类型,提供保存事件数据所需的全部字段或属性。

我只能说,写文档的和编写框架的人有一方是错的。或者说,写文挡的从规范的角度说,建议使用者这么做,但是编写框架的,考虑到兼容性,没有使用约束。总之,你最好按照文档约定的来,老老实实从 EventArgs 派生,因为文档是对所有开发者的约定,你不能指望每个开发者都能理解文档和实际框架之间的区别,对于一些人来说,文档的约束就是一种隐喻,你不应该打破它,除非你能有明确的理由。 --------------------编程问答-------------------- 事件数据类继承自EventArgs或者直接使用EventArgs是一种规范写法 --------------------编程问答--------------------
引用 楼主 YYATG 的回复:
C# code123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687using System;us……


Professional C# and.NET 4里面写的



--------------------编程问答-------------------- 的确4.5 中已经将Where TEventArgs:EventArgs 这个约束去除了。 --------------------编程问答-------------------- 委托很难理解 --------------------编程问答--------------------
不纠结了,就是4.5删除了,虽然不知道为了啥以后就知道了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,