zoukankan      html  css  js  c++  java
  • C# 1的核心基础之一——委托

    C# 1的核心基础之一——委托

    简单委托的构成

    1. 声明委托类型
      delegate void StringProcessor(string input);

    2. 为委托实例的操作找到一个恰当的方法
      void PrintString(string x)完全符合要求
      void PrintInteger(int x)参数类型不兼容
      void PrintTwoStrings(string x, string y)参数个数不匹配
      int GetStringLength(string x)返回类型不匹配
      void PrintObject(object x)C# 1要求完全相同的参数类型,所以虽然string从object派生,仍然不匹配。但是C# 2改善了这个状况。
      和参数类型一样,in、out、ref前缀也必须匹配,虽然很少使用。

    3. 创建委托实例
      至于具体采用哪种形式的表达式来创建委托实例,取决于操作使用实例方法还是静态方法。

      1. StringProcessor proc1, proc2;
      2. proc1 = new StringProcessor(StaticMethods.PrintString);// 静态方法
      3. InstanceMethod instance = new InstanceMethod();
      4. proc2 = new StringProcessor(instance.PrintString);//实例方法
    4. 调用委托实例

      处理使用C#简化语法的委托实例的调用。

    委托的实质是间接完成某种操作。

    合并和删除委托

    委托实例实际有一个操作列表,称为委托实例的调用列表
    System.Delegate类型的静态方法CombineRemove负责创建新的委托实例。很少直接调用,一般使用+/+=和-/-=操作符。
    调用委托实例时,它的所有操作顺序执行,Invoke的返回值是最后一个操作的返回值。如果调用列表中的任何操作抛出一个异常,都会阻止执行后续的操作。

    事件的简单讨论

    事件不是委托类型的字段。事件可以看做类似于属性(本质是方法)。

    1. 两者都声明为具有一种特定的类型,事件必须是一个委托类型。
    2. 属性的实质是在调用取值方法和赋值方法。同样在订阅或取消一个事件时,看起来像是通过+=和-=运算符使用委托类型的字段,而实际是调用add和remove方法。
    3. “事件”存在的首要理由和“属性”类似——添加一个封装层,实现发布/订阅模式。

    委托总结

    • 委托封装了包含特殊返回类型和一组参数的行为,类似包含单一方法的接口。
    • 委托类型声明中的签名决定了哪些方法可以用于创建委托实例,同时决定了调用的签名。
    • 创建委托实例,需要一个方法以及调用方法的目标(对于实例方法来说)。
    • 委托实例是不易变的(一旦创建,就不能改变。不用担心一致性和线程安全性)。
    • 每个委托实例都包含一个调用列表。
    • 委托实例可以合并在一起,也可以从一个委托实例中国删除另一个。
    • 事件不是委托实例——只是成对add/remove(类似属性的取值方法/赋值方法)。




  • 相关阅读:
    HTTP的GET和POST请求
    移动开发平台性能比較
    Struts2之类型转换器的使用
    对Socket CAN的理解(4)——【Socket CAN接收数据流程】
    当罗密欧遇到朱丽叶... ...当指针遇到数组
    Qt的Script、Quick、QML的关系与总结
    nyoj27水池数目 (DFS)
    HBase行锁原理及实现
    poj1852ant
    JSTL&EL表达式
  • 原文地址:https://www.cnblogs.com/qianzi067/p/6020318.html
Copyright © 2011-2022 走看看