• 泛型委托


    无论是在类定义内还是类定义外,委托可以定义自己的类型参数。引用泛型委托的代码可以指定类型参数来创建一个封闭构造类型,这和实例化泛型类或调用泛型方法一样,如下例所示:

    public delegate void MyDelegate<T>(T item);
    public void Notify(int i){}
    //...
     
    MyDelegate<int> m = new MyDelegate<int>(Notify);

    C#2.0版有个新特性称为方法组转换(method group conversion),具体代理和泛型代理类型都可以使用。用方法组转换可以把上面一行写做简化语法:

    MyDelegate<int> m = Notify;

     

    在泛型类中定义的委托,可以与类的方法一样地使用泛型类的类型参数。

    class Stack<T>
    {
    T[] items;
          int index
    //...
    public delegate void StackDelegate(T[] items);
    }

    引用委托的代码必须要指定所在类的类型参数,如下:

    Stack<float> s = new Stack<float>();
    Stack<float>.StackDelegate myDelegate = StackNotify;

    泛型委托在定义基于典型设计模式的事件时特别有用。因为sender[JX2] ,而再也不用与Object相互转换。

    public void StackEventHandler<T,U>(T sender, U eventArgs);
    class Stack<T>
    {
        //
        public class StackEventArgs : EventArgs{...}
        public event StackEventHandler<Stack<T>, StackEventArgs> stackEvent;
        protected virtual void OnStackChanged(StackEventArgs a)
        {
          stackEvent(this, a);
        }
    }
    class MyClass
    {
      public static void HandleStackChange<T>(Stack<T> stack, StackEventArgs args){...};
    }
    Stack<double> s = new Stack<double>();
    MyClass mc = new MyClass();
    s.StackEventHandler += mc.HandleStackChange;
  • 相关阅读:
    mybatis中#{}和${}的区别 (二)
    JAVA分布式架构的演变及解决方案
    mybatis中的#和$的区别
    https
    vue3的组件v-model初探1
    前端性能优化
    HTTP请求的完全过程
    http缓存详解,http缓存推荐方案
    vscode-setting备份
    Mac电脑在finder中添加- 右键打开vscode
  • 原文地址:https://www.cnblogs.com/XiaoRuLiang/p/12422293.html
Copyright © 2020-2023  润新知