zoukankan      html  css  js  c++  java
  • 【总结】C# 设置委托的机理和简要步骤

    【引语】实际上,和Winform打交道的第一天呢,我们就已经接触了委托,例如当双击button产生button1_click,这个呢,是对button1点击事件的处理方法,至于委托和订阅事件,就悄悄的写在你看不到的地方。好了,今天就来总结一下这个委托,看看它到底怎么运作的,它的书写步骤和注意事项又有哪些。讲之前还是声明一下,不管文章喜不喜欢,在别人看来是好还是烂,毕竟我写的,转载的话请尊重一下作者的劳动成果,保留作者信息及文章出处 http://www.cnblogs.com/MyateJx/p/3534885.html 。

    【正文】

    委托的关键组件有以下几个:

    定义委托
    定义事件(定义该委托类型的事件)
    处理方法(定义对该事件的处理方法)
    订阅事件(关联事件和处理方法)

    书写步骤是:

    定义被监控者的类,包括声明字段、构造函数、属性、以及要被监控的方法),例如:

    public class YuanGong
        {
            string _name;
            int _num;
    
            public YuanGong(string nm, int num)
            {
                _name = nm;
                _num = num;
            }
    
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            
          
            public int Num
            {
                get { return _num; }
                set { _num = value; }
            }
    
    
            public void 作死()
            {
                Console.WriteLine("嗯,我要作死了!");
            }
    
        }
    定义被监控者的类

    定义一个继承EventArgs的参数类,包括声明字段、属性,和被监控者类是保持一致的。例如:

    public class YgEventArgs:EventArgs
        {
            string _name;
            int _num;
    
    
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            
          
            public int Num
            {
                get { return _num; }
                set { _num = value; }
            }
        }
    定义参数类

    定义一个带参的委托。例如:

    public delegate void JianShi(object sender,YgEventArgs e);

    在被监控者的类中定义一个该委托类型的事件。例如:

    public event JianShi ZUOSI;

    在要被监控的方法中实例化一个参数类对象e,并以带参的方式插入上述事件。例如:

    public void zuosi()
            {
                Console.WriteLine("嗯,我要作死了!");
                YgEventArgs e = new YgEventArgs();
                e.Name = _name;
                e.Num = _num;
    
                ZUOSI(this,e);
            }
    实例化参数并安插监控事件

    定义一个监控者的类,包括对上述事件的处理方法,注意方法的返回值、形参表要和委托保持一致。例如:

    public class ChuLi
        {
            public void chuli(object sender,YgEventArgs e)
            {
                Console.WriteLine("WTF,{0}在{1}作死了!",e.Name,e.Num);
            }
        }
    定义一个监控者类并设置处理方法

    在主函数中实例化一个被监控者和一个监控者。

    订阅事件。

    调用被监控者要被监控的方法。例如:

    static void Main(string[] args)
            {
                YuanGong yg = new YuanGong("MyateJx", 1);
                ChuLi cl = new ChuLi();
    
                yg.ZUOSI+=new JianShi(cl.chuli);
    
                yg.zuosi();
    
                Console.ReadLine();
    
            }
    订阅事件 触发事件

    以上就是一个完完整整的委托处理。

    那么回过头来思考一下我们的button1,双击button1的时候,在Form1.cs中生成了button1_click的处理方法,而button1点击的事件在哪呢?这个是在Button类中已经声明的了。那么委托呢?委托就是默认的EventArgs,订阅事件呢,在Form1.Designer.cs中有写:

    this.button1.Click += new System.EventHandler(this.button1_Click);

    所以呢,可视化的VS编辑器就是这样,允许你只写处理方法,剩下的都交给它来办。如果你要自己写委托呢,就可以摘取上述步骤中的监控者类,也就是自己写一个监控者类,然后写一个订阅事件with监控者类中的处理方法,这样呢,就可以达到你想要的效果。

  • 相关阅读:
    grunt in webstorm
    10+ Best Responsive HTML5 AngularJS Templates
    响应式布局
    responsive grid
    responsive layout
    js event bubble and capturing
    Understanding Service Types
    To add private variable to this Javascript literal object
    Centering HTML elements larger than their parents
    java5 新特性
  • 原文地址:https://www.cnblogs.com/MyateJx/p/3534885.html
Copyright © 2011-2022 走看看