• C#委托和事件定义和使用


    委托

     定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int、string等等;而委托是将方 法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中。

    首先来看看声明委托的语句:

    public deletate void MyDelegate();  

    public:访问修饰符  delegate:关键字  void:返回类型  MyDelegate:委托名称  ( ):参数列表  

    看到声明大家会想了,为什么该委托的返回值,参数列表要这样的,我不能返回一个 string,一个int么?我不能给委托加几个参数么? 答案是:当然可以,但委托的定义是相对于方法来说的,因为得你的委托最终是要来注册方法的,而你的方法是具有某种签名的,所以你要给怎样签名的方法来声明 一个委托,该委托就要和该方法具有同等的签名,就类似于你用一个int 类型的变量去接受一个string类型的值,显然是不行的(个人理解).... 

     * 委托只要定义就可以了,我们并不需要关心他的实现  

    委托的使用

    注册委托有两种方法:

    第一种:直接将方法赋值[=]或者用“+=” 给一个委托==>委托名 =[+=]  方法名 

    第二种:委托本质也是一个类,只是一个特殊的类,所以我们也可以实例化一个委托对象通过委托构造函数来注册委托==》委托名 对象名= new 委托名(方法名) 

    事件

    -事件是一种特殊的委托的实例,或者说是受限制的委托,是委托一种特殊应用,在类的外部只能施加+=,-=操作符,二者本质上是一个东西。

    -event ActionHandler Tick; // 编译成创建一个私有的委托示例, 和施加在其上的add, remove方法. 

    -event只允许用add, remove方法来操作,这导致了它不允许在类的外部被直接触发,只能在类的内部适合的时机触发。委托可以在外部被触发,但是别这么用。

    -使用中,委托常用来表达回调,事件表达外发的接口。

    -委托和事件支持静态方法和成员方法, delegate(void * pthis, f_ptr), 支持静态返方法时, pthis传null.支持成员方法时, pthis传被通知的对象.

    -委托对象里的三个重要字段是, pthis, f_ptr, pnext, 也就是被通知对象引用, 函数指针/地址, 委托链表的下一个委托节点.

    1. 怎样定义委托类型?

    delegate + function signature // delegate相当于class关键字, function name相当于定义的委托类型.

    delegate void Action();

    2. 怎样定义委托实例? Action action;

    3. 怎样定义事件?

       先定义委托类型 delegate void ActionHandler(object sender, EventArgs args);

       再定义事件实例  event ActionHandler Tick;

    记忆的方法:

    委托和事件相当于字段和属性

    delegate关键字类比于class关键字, 定义的是一种委托类型,然后再创建委托示例.

    创建委托实例时, 用event关键字来修饰就变成了创建一个事件. 也就是事件是一种特殊的委托.

     1 using System;
     2 
     3 namespace Test
     4 {
     5     class Program
     6     {
     7         static void TestEvent()
     8         {
     9             Console.WriteLine("test event");
    10         }
    11 
    12         static void TestDelegate()
    13         {
    14             Console.WriteLine("test delegate");
    15         }
    16 
    17         static void Main(string[] args)
    18         {
    19 
    20             MyClass myObject = new MyClass();
    21             myObject.WorkCompletedDelegate += TestDelegate;
    22             myObject.WorkCompleted += TestEvent;
    23 
    24             myObject.Fire();
    25             myObject.WorkCompletedDelegate();
    26         }
    27     }
    28 
    29     class MyClass
    30     {
    31         public delegate void CompletedEventHandler();
    32 
    33         public event CompletedEventHandler WorkCompleted;
    34         public CompletedEventHandler WorkCompletedDelegate;
    35 
    36         public void Fire()
    37         {
    38             if (this.WorkCompleted != null)
    39             {
    40                 this.WorkCompleted();
    41             }
    42 
    43             if (this.WorkCompletedDelegate != null)
    44             {
    45                 this.WorkCompletedDelegate();
    46             }
    47         }
    48     }
    49 }
  • 相关阅读:
    同一WpfApplication下简单的页面转换
    触发器
    程序包
    函数
    存储过程
    游标
    我的第一个SolidWorks图
    张量系列(tensor02)
    张量系列-Tensor(01)
    Python与矩阵论——特征值与特征向量
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/6828136.html
Copyright © 2020-2023  润新知