C#学习笔记之一:委托

关键字:delegate

标记:=>

首先明确一点:委托的签名指的是函数的返回类型和参数类型。

1.委托是什么?能干什么?

委托(类型)是一种引用型数据类型,可以引用的对象是一个至多个方法。
(1)委托相当于C/C++中的函数指针,但委托类型更加安全。
(2)委托允许将方法作为参数传递。
(3) 委托还可以将代码块作为参数传递(匿名方法实现)。
(4)委托可以组合链接,以实现一个事件调用多个方法。
(5)委托方法可以不需要与委托签名精确匹配(协变和逆变特性)。
(6) 委托可以用于回调方法。

2.委托如何使用?

(1)声明一个委托类型
public   delegate   int  DelegateType( string  msg);
这样DelegateType就是一个委托类型了。
(2)实例化一个委托
DelegateType mydelegate;
这样mydelegate就是委托类型DelegateType的一个对象了,接下来要对该对象进行操作。
(3)为委托添加一个方法
能添加到某个委托类型对象中去的方法需要满足一个原则: 方法签名和委托类型的签名要一致
A.一种写法是先定义委托对象,再在后面的代码中添加方法:
//假设以下代码位于类Sample中,并且已经定义了该类的对象:
//Sample sample = new Sample();
int  ActualMethod_No1( string  message);
//......函数实现
mydelegate  =  sample.ActualMethod_No1;
B.另一种将实例化和添加初始方法合并为一步操作的写法是:
DelegateType  mydelegate =   new  DelegateType(sample.ActualMethod_No1);

假设我们还有另外的一个方法具有同样的签名:
int  ActualMethod_No2( string  otherString);
我们想将其加入这个委托对象中去,可以这样写:
mydelegate +=  sample.ActualMethod_No2;
这样的话我们这个委托对象就有两个方法了,调用委托对象时,是 按添加顺序依次执行的~,这也是组合委托的用法。
(4)从委托删除一个方法
删除一个方法简单:
mydelegate -=  sample.ActualMethod_No1;
这样此时delegate中只剩_No2这个方法了。
(5)调用一个委托对象
调用一个委托对象和调用一个函数一样,根据参数类型和返回值来书写就可以了:
string  stringInput;
//......Maybe "stringInput" has already been some value
int  returnValue    mydelegate(stringInput);

3.委托的一些特性

(1)回调中的委托
A.什么是回调:回调 指通过函数参数 传递到其它代码的,某一块可执行代码 的引用。 回调允许函数调用者在运行时调整原始函数的行为,
另一种用途在于处理信号或者类似物。
B.C#中怎么实现回调:将委托对象作为方法参数传递进方法内部,再在方法内部调用该委托对象以实现调用其他方法。
即: A方法通过将委托作为参数传递来调用委托,并用委托能够传递参数的功能调用方法B,用同一个代码框架实现运行时动态调整方法行为的目的。
(2)协变和逆变
协变和逆变特性使得委托的限制比较宽松,易于实际使用:
A.协变:针对 返回类型的。指 方法的返回值类型直接或间接 继承委托签名的返回值类型。
如有方法:
MyInt ActualMethod_No1( string  message);     //MyInt继承于int类型
B.逆变:针对 参数类型的。指 委托签名的参数类型直接或间接 继承方法的参数类型。
如有委托:
public   delegate   int  DelegateType(MyStringType msg);     //MyStringType继承于string类型
协变和逆变的方法都是可以添加到委托中使用的。

4.委托的一些其他面貌

(1)匿名方法
A.什么叫匿名方法?
    仅仅是一个完成特定功能的代码块。
B.为什么要有匿名方法?好在哪?
    减少系统开销(因为此时方法仅仅在委托使用时才定义)
C.怎么定义匿名方法并将其加入委托对象中?
    DelegateType  mydelegate =   delegate ( string  message)
    {
         //Do Something Here;
         //Maybe There is a "return" statement
    };
      int  returnValue  =   mydelegate( /*这里是运行时传入的参数*/ );
D.一些注意的地方
    a.不允许在匿名方法的内外部跳转;
    b.匿名方法内部不能访问不安全的代码;
    c.不能在匿名方法内部使用外部定义的ref和out参数,其他的可以。
(2)λ表达式
A.什么叫λ表达式?
    就是匿名方法。只是写法更加简洁。
B.怎么写一个λ表达式?
    DelegateType  mydelegate =  ( string  message) = >      //读作"goes to"
    {
          //Do Something Here;
          //Maybe There is a "return" statement
     };
     int  returnValue  =   mydelegate( /*这里是运行时传入的参数*/ );
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值