• 不忘本~委托与事件


    返回目录

    MSDN是这样定义委托的:

    委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

    下面这个委托及事件主要完成显示按钮名称和值的功能

         
     1 /// <summary>
     2 
     3     /// 自定义委托
     4 
     5     /// </summary>
     6 
     7     class SelfDelegate
     8 
     9     {
    10 
    11         /// <summary>
    12 
    13         /// 显示工具控件信息
    14 
    15         /// </summary>
    16 
    17         /// <param name="sender"></param>
    18 
    19         internal delegate void ToolInfo(object sender); //把委托看成是一种特殊的类,而事件就是委托类的一个实例
    20 
    21  
    22 
    23         /// <summary>
    24 
    25         /// 显示控件信息事件
    26 
    27         /// </summary>
    28 
    29         internal event SelfDelegate.ToolInfo ToolName;
    30 
    31  
    32 
    33         /// <summary>
    34 
    35         /// 事件触发机制
    36 
    37         /// </summary>
    38 
    39         /// <param name="sender"></param>
    40 
    41         internal void doEvent(object sender)
    42 
    43         {
    44 
    45             ToolName(sender);//事件名(方法签名)
    46 
    47         }
    48 
    49  
    50 
    51     }

    在Form1部分类中的内容是:

         
     1   SelfDelegate sd = new SelfDelegate();
     2 
     3         /// <summary>
     4 
     5         /// this.button1.Click += new System.EventHandler(this.button1_Click);
     6 
     7         /// 为事件加上一个委托实例,这行是VS自动添加上去的
     8 
     9         /// this.button1就是我们刚刚添加的按钮
    10 
    11         /// </summary>
    12 
    13         /// <param name="sender"></param>
    14 
    15         /// <param name="e"></param>
    16 
    17         private void button1_Click(object sender, EventArgs e)
    18 
    19         {
    20 
    21             MessageBox.Show("按钮单击事件被触发");
    22 
    23  
    24 
    25             sd.ToolName += new SelfDelegate.ToolInfo(ShowToolName);
    26 
    27             sd.ToolName += new SelfDelegate.ToolInfo(ShowToolValue);
    28 
    29             sd.doEvent(sender); //将本对象源作为参数传递
    30 
    31         }
    32 
    33  
    34 
    35         #region 实现了委托方法签名的方法
    36 
    37         /// <summary>
    38 
    39         /// 显示控件名称
    40 
    41         /// </summary>
    42 
    43         /// <param name="sender"></param>
    44 
    45         private void ShowToolName(object sender)
    46 
    47         {
    48 
    49             Button btn = sender as Button;
    50 
    51             if (btn != null) //转换成功,失败为null,系统不会抛异常
    52 
    53             {
    54 
    55                 MessageBox.Show(string.Format("控件名称:{0}", btn.Name));
    56 
    57             }
    58 
    59         }
    60 
    61  
    62 
    63         private void ShowToolValue(object sender)
    64 
    65         {
    66 
    67             Button btn = sender as Button;
    68 
    69             if (btn != null) //转换成功,失败为null,系统不会抛异常
    70 
    71             {
    72 
    73                 MessageBox.Show(string.Format("控件值:{0}", btn.Text));
    74 
    75             }
    76 
    77         }
    78 
    79         #endregion

    进行.net4.0之后,frameworks帮我们封装了很多委托,其中Action和Func<T>是比较常用的,Action表示一个没有返回值的委托,而Func<T>表示一个返回值类型为T的委托,当然它们也有其它很多重载,根据具体的应用去使用它们。

    返回目录

     返回目录

  • 相关阅读:
    1-15-2-RAID1 企业级RAID磁盘阵列的搭建(RAID1、RAID5、RAID10)
    1-15-1 RAID磁盘阵列的原理和搭建
    伪随机数算法(一)
    Swing---WindowConstants
    cmd_ping命令
    开灯问题
    freopen()函数
    Beginning Python Chapter 3 Notes
    Beginning Python Chapter 2 Notes
    String | StringBuffer | StringBuilder 比较
  • 原文地址:https://www.cnblogs.com/lori/p/2076364.html
Copyright © 2020-2023  润新知