CSharp Basic Tutorial Chapter-4-1 委托(上)


Delegates 委托

  • 委托是一个对象,它知道如何调用一个方法

委托类型和委托实例

  • 委托类型定义了委托实例可以调用的那类方法,具体来说,委托类型定义了方法的返回类型和参数。

例子
case

委托实例

把方法赋值给委托变量的时候就创建了委托实例。

Transformer t=Square;

调用

int answer = t(3);  //answer is 9

完整的例子
demo1
demo2
demo3

  • 委托的实例其实就是调用者的委托:调用者调用委托,然后委托调用目标方法。
  • 间接的把调用者和目标方法解耦合了。
Transformer t = Square;
Trandformer t = new Transformer(Square);
t(3)
t.Invoke(3)

编写插件式的方法

  • 方法是在运行时才赋值给委托变量的

plugindemo1
plugindemo2
plugindemo3

多播委托

  • 所有的委托实例都具有多播的能力。一个委托实例可以引用一组目标方法。

multiple

    • 和 += 操作符可以合并委托实例
  • 调用d就会调用SomeMethod1和SomeMethod2
  • 委托的调用顺序与它们的定义顺序一致
    • 和 -= 会把右边的委托从左边的委托里移除
d-=SomeMethod1;
  • 委托变量使用+或+=操作符时,其操作数可以是null。就相当于把一个新的值赋给了委托变量。
SomeDelegate d = null;
d += SomeMethod1;

相当于:

d = SomeMethod1;
  • 对单个目标方法的委托变量使用-=操作符时,就相当于把null值赋给了委托变量。
  • 委托是不可变的
  • 使用+=或-=操作符时,实际上是创建了新的委托实例,并把它赋给当前的委托变量。
  • 如果多播委托的返回类型不是void,那么调用者从最后一个被调用的方法来接收返回值。前面的方法仍然会被调用,但是其返回值就被弃用了。

multipledemo1
multipledemo2

委托

  • 所有的委托类型都派生于 System.MulticastDelegate,而它又派生于System.Delegate。
  • C#会把作用于委托的+,-,+=,-=操作编译成使用System.Delegate的Combine和Remove两个静态方法。

delegate


文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
CSharp Basic Tutorial Chapter-4-2 委托(下) CSharp Basic Tutorial Chapter-4-2 委托(下)
实例方法目标和静态方法目标 当一个实例方法被赋值给委托对象的时候,这个委托对象不仅要保留着对方法的引用,还要保留着方法所属实例的引用。 System.Delegate 的Target属性就代表着这个实例。 如果引用的是静态方法,那么Targ
下一篇 
CSharp Basic Tutorial Chapter-3-13 协变  逆变  不变 CSharp Basic Tutorial Chapter-3-13 协变 逆变 不变
Covariance, Contravariance, Invariance T 既作为输入 又作为输出 是不对的 危险的 Covariance 协变,当值作为返回值/out 输出 Contravariance 逆变,当值作为输入
  目录