服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

初探.net中的delegate类型与.net事件


  1.了解delegate
  
  delegate可以认为是一种函数的指针,一个delegate类型的实例代表可以代表一个方法,在实际使用中我们可以在不知道方法名称的情况下调用到这个方法。前面说太多可能会使大家变得糊涂,或者摸不着头脑,我举个例子,来详细说明此种类型的用法:
  
  整个例程的代码,是控制台项目.
  
  //代码开始
  using system;
  
  namespace consoleapp1
  {
  
  public delegate string functionpointer(string strname);
  class class1
  {
  
  [stathread]
  static void main(string[] args)
  {
  //
  // todo: 在此处添加代码以启动应用程序
  system.console.writeline("hello world!");
  functionpointer fpa = new functionpointer(afunction);
  functionpointer fpb = new functionpointer(bfunction);
  invokemethod(fpa);
  invokemethod(fpb);
  system.console.readline();
  //
  }
  public static string afunction(string snamea)
  {
  return "afunction say i'm " + snamea;
  }
  public static string bfunction(string snameb)
  {
  return "bfunction say i'm " + snameb;
  }
  public static void invokemethod(functionpointer fp)
  {
  system.console.writeline(fp("storm"));
  }
  }
  }
  //代码结束
  
  步骤1:要使用delegate类型首先应该建立delegate样板,所谓delegate样板其实就是delegate能够调用的方法的签名,什么是方法的签名?方法的签名可以认为是方法的参数类型、数量、返回值类型这些特征。
  
  定义的形势如下: 访问修饰符(public) delegate 返回值类型 名称(参数列表);
  
  说明:返回值类型应该是你定义的delegate类型所准备调用的方法的返回值类型,参数列表应该与你准备使用delegate来调用的方法的参数列表相同(指的是数量、类型、顺序相同,名称当然无所谓了)
  一个实际的例子就是上面程序的
  public delegate string functionpointer(string strname);
  
  步骤2:定义delegate准备调用的方法,当然该方法要与你刚才声明的delegate有相同的返回值和参数表;
  例如上面程序的:
  public static string afunction(string snamea)
  {
  return "afunction say i'm " + snamea;
  }
  public static string bfunction(string snameb)
  {
  return "bfunction say i'm " + snameb;
  }
  
  步骤3:定义delegate类型的处理函数,在这里可以定义如何调用你的delegate类型所指的方法,在实际使用中可以在这里来动态决定传入的参数等信息。
  如上面程序的
  public static void invokemethod(functionpointer fp)
  {
  system.console.writeline(fp("storm97"));
  }
  
  步骤4:建立delegate实例,传入欲调用的方法名,要使用delegate类型必须建立他的实例,一个实例代表了一个方法的引用(可以这样说)
  
  delegate实例定义的形式:
  xxx(代表你定义的某个delegate类型的名称) 实例名(假设是实例a) = new xxx([欲调用的方法名(假设是方法a)]);
  意思是实例变量a指向方法a的程序代码段;
  如:
  
  static void main(string[] args)
  {
  //
  // todo: 在此处添加代码以启动应用程序
  system.console.writeline("hello world!");
  //建立第一个delegate的实例fpa,该实例代表方法afunction;
  functionpointer fpa = new functionpointer(afunction);
  //建立第一个delegate的实例fpa,该实例代表方法bfunction;
  functionpointer fpb = new functionpointer(bfunction);
  ......
  //
  }
  下面就可以运行整个程序了。
  如:
  static void main(string[] args)
  {
  //
  ......
  //调用方法afunction
  invokemethod(fpa);
  //调用方法bfunction
  invokemethod(fpb);
  //
  }
  
  输出结果: afunction say i'm storm97
  bfunction say i'm storm97

扫描关注微信公众号