3.C# 委托与事件

委托

delegate是一种可用于封装命名方法或匿名方法的引用类型。委托类似于C++中的函数指针;但是委托是类型安全和可靠的。

委托类型的声明与方法签名相似,它有一个返回值和任意数目任意类型的参数。

委托的声明原型:

delegate <函数返回类型> <委托名> (<函数参数>)

例:

public delegate void TestDelegate(string message);

public delegate int TestDelegate(MyType m,long num);

委托是事件的基础。

通过将委托与命名方法或匿名方法关联,可以实例化委托。

必须使用具有兼容返回类型和输入参数的方法或lambda表达式实例化委托。

为了与匿名方法一起使用,委托和与之关联的代码必须一起声明。

示例:

// Declare delegate -- defines required signature:

delegate double MathAction(double num);

class DelegateTest

{

    // Regular method that matches signature:

    static double Double(double input)

    {

        return input * 2;

    }

    static void Main()

    {

        // Instantiate delegate with named method:

        MathAction ma = Double;

        // Invoke delegate ma:

        double multByTwo = ma(4.5);

        Console.WriteLine("multByTwo: {0}", multByTwo);

        // Instantiate delegate with anonymous method:

        MathAction ma2 = delegate(double input)

        {

            return input * input;

        };

        double square = ma2(5);

        Console.WriteLine("square: {0}", square);

        // Instantiate delegate with lambda expression

        MathAction ma3 = s => s * s * s;

        double cube = ma3(4.375);

        Console.WriteLine("cube: {0}", cube);

    }

    // Output:

    // multByTwo: 9

    // square: 25

    // cube: 83.740234375

}

事件

事件是一种特殊的委托,其实事件就是对委托的封装。

隐式事件声明:

event <委托类型> 事件名

例:

public event CheckDelegate checkEvent;

反射机制中:

可以看到在事件被编译后自动生成了个private的委托实例checkEvent和两个函数add_checkEvent和remove_checkEvent,这两个函数分别对应事件的+=/-=操作,另外可以看到在声明了事件后的确是产生了一个和事件同名私有的委托实例checkEvent,对事件的+=/-=操作都会反映在这个同名委托实例checkEvent上,所以可以在定义事件的类里面直接调用checkEvent()来执行注册函数和对checkEvent使用=号重新赋值,实际上这里操作的并不是checkEvent事件,而操作的是同名委托实例checkEvent,因此隐式声明的事件,其实就是由一个委托实例和两个函数封装而成,所有的操作最终都反映在委托实例上。

显式事件声明:

event <委托类型> 事件名

{

      add

      {

            //将函数注册到自己定义的委托实例

      }

      remove

      {

            //解除函数对自己定义的委托实例的注册

      }

}

显示声明事件就是要自己手动实现隐式声明中的一个委托实例和两个函数。

例:

private CheckDelegate _checkDelete;

public event CheckDelegate checkEvent

{

    add

    {

_checkDelete = Delegate.Combine(_checkDelete, value) as CheckDelegate;

    }

    remove

    {

_checkDelete = Delegate.Remove(_checkDelete, value) as CheckDelegate;

    }

}

反射机制中:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容