zoukankan      html  css  js  c++  java
  • .NET事件的指导原则

          C#允许编写所需的各种类型的事件。但是,为了与.NET Framwork的组件相兼容,开发人员必须遵循微软为此建立的一系列指导原则。这些指导原则的核心是,事件处理程序必须拥有两个参数。第一个参数是一个引用,它指向产生该事件的对象;第二个参数为EventArgs类型,它包含处理程序所需的其他信息。因此,与.NET兼容的处理程序通常采用下面的通用形式:

    void handler(object sender,EventArgs e)
    {
       
    }

    其中,一般由调用代码向sender参数传递this值。e参数包含了附加的信息,如果方法并不需要这些信息,那么可以忽略他们。
    EventArgs类本身并不包含传递附加数据给处理程序的字段。因此,EventArgs类只能用作基类,开发人员必须派生新的子类以包含必须的字段。另外,是EventArgs类定义的一个static字段,它可以存储不包含数据的EventArgs对象。

    下面是我创建了一个与.NET兼容的事件

     class MyEeventAgrs:EventArgs
        {
            public int eventNum;
        }
        //申明一个委托类型事件
        delegate void MyEnventHandler(object sender,MyEeventAgrs e);
    
        class MyEvent
        {
            static int count = 0;
            public event MyEnventHandler SomeEvent;
    
            public void OnSomeEvent()
            {
                MyEeventAgrs arg = new MyEeventAgrs();
    
                if(SomeEvent!=null)
                {
                    arg.eventNum = count++;
                    SomeEvent(this, arg);
                }
            }
        }
        class XX
        {
            public void Handler(object sender,MyEeventAgrs e)
            {
                Console.WriteLine("事件:"+e.eventNum+",收到一个XX对象");
                Console.WriteLine("来源自:"+sender);
            }
        }
        class YY
        {
            public void Handler(object sender, MyEeventAgrs e)
            {
                Console.WriteLine("事件:" + e.eventNum + ",收到一个XX对象");
                Console.WriteLine("来源自:" + sender);
            }
        }
    
    
        class Program
        {
            static void One()
            {
                Console.WriteLine("Hello World");
            }
            static void Two()
            {
                Console.WriteLine("Two");
            }
            static void Main(string[] args)
            {
                XX x = new XX();
                YY y = new YY();
                MyEvent evt = new MyEvent();
                evt.SomeEvent += x.Handler;
                evt.SomeEvent += y.Handler;
                evt.OnSomeEvent();
                evt.OnSomeEvent();
            }

           这个示例中呢, MyEeventAgrs派生于EventArgs类。 MyEeventAgrs类添加了一个自己的字段eventNum。接着,声明一个事件处理程序委托MyEnventHandler。该委托可以接受.NET Framework规定的两个参数。前面介绍过,第一个参数是对事件的对象的引用,第二个参数是对EventArgs类或者其派生类的引用。然后,定义XX和YY类中的事件处理程序Handler(),并使用了相同类型参数。

         在MyEvent类的内部声明为SomeEvent的MyEventHandler事件委托。在OnSomeEvent()方法中调用SomeEvent事件委托时,将第一个实参指定为this,

    第二个实参指定为一个MyEventArgs实例。因此,MyEventHandler事件委托可以获得正确的参数以实现与.NET兼容。

        在基于消息的环境(windows操作系统)中,事件得到了广泛的应用。在这样的环境中,程序将一直等待,知道接收到消息才采取相应的行动。比如,我要在注册一个用户,而这个事件呢,一开始在运行这个程序的时候就已经注册了,现在一直是等待状态,当我填写完信息,在提交的那一刻,后台就会接受这个消息,指定到注册的事件中去处理,下面我写这样的一个程序,当我按某个键的时候,程序就会调用方法以激活事件。

     1     class KeyEventArgs : EventArgs
     2     {
     3         public char ch;
     4     }
     5     class KeyEvent
     6     {
     7         public event EventHandler<KeyEventArgs> KeyPress;
     8 
     9         public void OnKeyPress(char key)
    10         {
    11             KeyEventArgs k = new KeyEventArgs();
    12             if(KeyPress!=null)
    13             {
    14                 k.ch = key;
    15                 KeyPress(this, k);
    16             }
    17         }
    18     }
    19 
    20 
    21     class Program
    22     {
    23      
    24         static void Main(string[] args)
    25         {
    26             KeyEvent kvent = new KeyEvent();
    27             ConsoleKeyInfo key;
    28             int count = 0;
    29             kvent.KeyPress += (sender, e) => Console.WriteLine("接收到键:"+e.ch);
    30             kvent.KeyPress += (sender, e) => count++;
    31             Console.WriteLine("输入一些字符,输入.停止");
    32             do
    33             {
    34                 key = Console.ReadKey();
    35                 kvent.OnKeyPress(key.KeyChar);
    36             } while (key.KeyChar!='.');
    37             Console.WriteLine(count+"个键通过");
    38         }
    39 
    40     }


    最后,虽然本人不是做这种事件驱动模式做开发,不过这里给了初学者或对事件不明白的同学做了很好的示例,小弟不才,如果有错误的地方希望指出,互相交流学习。如果看了我这个也不是很明白的请访问

    MSDN:

    委托

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

    事件

    http://msdn.microsoft.com/zh-cn/library/awbftdfh(v=vs.90).aspx

    欢迎访问

  • 相关阅读:
    ASP.NET动态加载用户控件的页面生成过程
    简单的flash与asp.net通信(LoadVars类)
    转 推荐两本FLASH RIA应用开发方面的书籍
    关于代码加密解密保护
    转 利用 SharpZipLib方便地压缩和解压缩文件
    在C#中应用哈希表(Hashtable)
    C#中解析并运行一个本地命令行
    About Windows Live Writer
    安装sql server 2008,提示要删除SQL Server 2005 Express 工具,可我根本没装
    [转] C#中的null
  • 原文地址:https://www.cnblogs.com/JunXiao/p/3291902.html
Copyright © 2011-2022 走看看