zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/6828136.html
Copyright © 2011-2022 走看看