栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

深入解析C#编程中泛型委托的使用

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入解析C#编程中泛型委托的使用

在看泛型委托之前还需要先了解委托的概念。
这里讲的委托有两种类型一种是有返回值的,另一种是事件委托。

  //定义有返回值的委托 
  public delegate string GenricDelegate(T title, S author);

  //定义事件委托。
  public delegate void GenricDelegateEnent(E Name,P Address);

  public class GenericDelegateClass
  {
    //声明委托
    public GenricDelegate Gdelevalue;
    //声明事件委托
    public event GenricDelegateEnent GdEvent = null;

    public string GetValues(V title, F author)
    {
      //调用委托
      return Gdelevalue(title, author);
    }

    public GenericDelegateClass()
    {
    }

    public void InvokeEvent(V name, F address)
    {
      if (GdEvent != null)
      {
 //调用委托
 GdEvent(name, address);
      }
    }
  }

上面我们定义及调用了泛型委托,接下来就来梆定委托。

    private void btnDelegate_Click(object sender, EventArgs e)
    {

      GenericDelegateClass gd = new GenericDelegateClass();
      //将DelegateReturn事件梆定给Gdelevalue
      gd.Gdelevalue = new GenricDelegate(DelegateReturn);
      //将GenericEvent事件梆定给GdEvent
      gd.GdEvent += new GenricDelegateEnent(GenericEvent);
    }

    public string DelegateReturn(T title,S author)
    {
      return title.ToString() + author;
    }

    private void GenericEvent(V name, F address)
    {
      //
    }

在这里我们看到我在梆定DelegateReturn的时候并没有带泛型参数。在这里的泛型参数其实是没什么意义的。因为他的类型取决于调用委托的方法的类型。也就是在前面那段代码中InvokeEvent方法的类型,这里的DelegateReturn要用泛型方法是可以随时跟InvokeEvent的参数类型保持一至。这样梆定后我们再来调用gd.GetValues("my generic post","fastyou");这样调用的其实就是DelegateReturn的方法,这就是委托的好处了,同样调用gd.InvokeEvent("my generic post","fastyou");就是GenericEvent方法。

委托 可以定义自己的类型参数。引用泛型委托的代码可以指定类型参数以创建已关闭的构造类型,就像实例化泛型类或调用泛型方法一样,如下例所示:

public delegate void Del(T item);
public static void Notify(int i) { }

Del m1 = new Del(Notify);

C# 2.0 版具有称为方法组转换的新功能,此功能适用于具体委托类型和泛型委托类型,并使您可以使用如下简化的语法写入上一行:

Del m2 = Notify;
在泛型类内部定义的委托使用泛型类类型参数的方式可以与类方法所使用的方式相同。

class Stack
{
  T[] items;
  int index;

  public delegate void StackDelegate(T[] items);
}

引用委托的代码必须指定包含类的类型变量,如下所示:

private static void DoWork(float[] items) { }

public static void TestStack()
{
  Stack s = new Stack();
  Stack.StackDelegate d = DoWork;
}

根据典型设计模式定义事件时,泛型委托尤其有用,因为发送方参数可以为强类型,不再需要强制转换成 Object,或反向强制转换。

delegate void StackEventHandler(T sender, U eventArgs);

class Stack
{
  public class StackEventArgs : System.EventArgs { }
  public event StackEventHandler, StackEventArgs> stackEvent;

  protected virtual void onStackChanged(StackEventArgs a)
  {
    stackEvent(this, a);
  }
}

class SampleClass
{
  public void HandleStackChange(Stack stack, Stack.StackEventArgs args) { }
}

public static void Test()
{
  Stack s = new Stack();
  SampleClass o = new SampleClass();
  s.stackEvent += o.HandleStackChange;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124432.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号