c#中的委托

C#委托可以看做是方法引用,或者叫方法指针,它和c++中使用的函数指针最大的区别就是 委托是类型安全的。

    委托声明时必须将方法的返回值和详细的参数列表列出来,这样在为委托指定方法时,可以进行类型安全的检查。

    委托声明的方式如下:

  1. public   delegate   int  AddHandler( int  value);

     委托的关键字是delegate,除去这个关键字,其余部分就是一个完整的方法签名的格式,包括了委托返回类型、委托名称和委托所需的详细参数列表。

      为委托指定方法有以下几种方式:

  • 通过实例化委托对象的方式来指定方法

  1.  1 public delegate int AddHandler(int value);
     2 
     3 public int Add(int value)
     4 {
     5     System.Console.WriteLine(value);
     6     return value + 1;
     7 }
     8 
     9 //通过实例化的方式来为委托指定方法
    10 AddHandler addHandler = new AddHandler(Add);
  • 通过直接指定的方式来为委托指定方法

  1. public delegate int AddHandler(int value);

    public int Add(int value)
    {
        
    return value + 1;
    }

    //通过直接指定的方式为委托指定方法
    AddHandler addHandler = Add;

  • 通过匿名方法的方式来为委托指定方法

  1. 1 public delegate int AddHandler(int value);
    2 
    3 //通过匿名方法的方式为委托指定方法
    4 AddHandler addHandler = delegate(int value) { return value + 1; };

     使用委托的方式:

  1. addHandler( 5 );

     一个委托可以指定多个方法,当一个委托被指定多个方法后,在执行委托时,它指定的方法会被依次调用。


  1.  1 public delegate int AddHandler(int value);
     2 
     3 public int Add(int value)
     4 {
     5     value += 1;
     6     System.Console.WriteLine(value);
     7     return value;
     8 }
     9 
    10 public int Add2(int value)
    11 {
    12     value += 2;
    13     System.Console.WriteLine(value);
    14     return value;
    15 }
    16 
    17 public void Test()
    18 {
    19    //委托addHandler指定Add方法
    20    AddHandler addHandler = Add;
    21    //将Add2方法添加到addHandler中
    22    addHandler += Add2;
    23 
    24    addHandler(5);
    25 }

     我们通过+=操作来为委托添加方法,通过-=操作来为委托去除方法。

 

     有时,委托和接口会发生混淆,委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。


  1.  1 public delegate int AddHandler(int value);
     2 
     3 public int Add(int value)
     4 {
     5     value += 1;
     6     return value;
     7 }
     8 
     9 public void Test(AddHandler addHandler, int value)
    10 {
    11     System.Console.WriteLine(addHandler(value));
    12 }
     我们可以按照以下的方式来使用Test方法
  1. Test(program.Add,  5 );
     但是我们也可以使用接口的方式来实现上面 委托实现的功能

  1. interface IAddHandler
    {
        
    int Add(int value);
    }

    class MyAddhandler : IAddHandler
    {
        
    public int Add(int value)
        {
            value 
    += 1;
            
    return value;
        }
    }

    public void MyTest(IAddHandler addHandler, int value)       
    {                                                   
        System.Console.WriteLine(addHandler.Add(value));
    }  

     我们可以按照以下的方式来使用MyTest方法

  1. MyAddhandler addHandler  =   new  MyAddhandler();
    MyTest(addHandler, 
    5 );

     那么如何去却分委托和接口呢,MSDN上是这么建议的:

     在以下情况中使用委托

  • 当使用事件设计模式时。

  • 当封装静态方法可取时。

  • 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。

  • 需要方便的组合。

  • 当类可能需要该方法的多个实现时。

     在以下情况中使用接口:

  • 当存在一组可能被调用的相关方法时。

  • 当类只需要方法的单个实现时。

  • 当使用接口的类想要将该接口强制转换为其他接口或类类型时。

  • 当正在实现的方法链接到类的类型或标识时:例如比较方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值