• 【总结】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监控者类中的处理方法,这样呢,就可以达到你想要的效果。

  • 相关阅读:
    关于C#中Environment.OSVersion判断操作系统及Win10上的问题
    C#各种数组直接的数据复制/转换
    移位操作<<和>>,是逻辑数字上的移动(和大端小端无关)
    log4net学习笔记
    链接错误——无法解析的外部符号 ConvertStringToBST
    当Thread.Sleep的暂停时间参数设置过小时,精度很差的解决方法
    Python发送邮件
    Python使用HTMLTestRunner运行所有用例并产生报告
    pandas学习笔记
    Python requests模块做接口测试
  • 原文地址:https://www.cnblogs.com/MyateJx/p/3534885.html
Copyright © 2020-2023  润新知