初探.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

当然,从这个例子看不出delegate有什么优势,因为这个程序太简单了,也许有人会说调用方法要这么麻烦吗,我直接调用就算了,何必要绕个大圈儿去调用呢,其实在实际应用中这种方式会给我们带来很大的灵活性,以后在实际使用过程中你们会慢慢体会到的。:)

时间: 2024-09-21 22:40:09

初探.NET中的delegate类型与.NET事件的相关文章

C#中的delegate和event

标题    C#中的delegate和event    sam1111(原作) 关键字    .NET, C# 在基于Windows平台的程序设计中,事件(event)是一个很重要的概念.因为在几乎所有的Windows应用程序中,都会涉及大量的异步调用,比如响应点击按钮.处理Windows系统消息等,这些异步调用都需要通过事件的方式来完成.即使在下一代开发平台--.NET中也不例外. 那么什么是事件呢?所谓事件,就是由某个对象发出的消息,这个消息标志着某个特定的行为发生了,或者某个特定的条件成立

c#-简单介绍一下C#中的delegate的作用?

问题描述 简单介绍一下C#中的delegate的作用? 就是对C#中delegate的用法不是很清楚,是不是类似于C++中的函数指针 解决方案 给你说一个实例,比如查询一个数据量大约百万的数据表,在查询的过程中界面是会呈现"假死",也就是卡死的状态,直到返回查询结果才恢复. 这时,通常会使用多线程 Thread 来新建一个线程去执行这条语句,这样主界面所在的主线程不会受影响,也就不会出现界面卡死的情况. 说了这么多还没说到deleate,也就是委托.如果子线程在执行的过程中,想要调用主

怎么去掉Xcode工程中的某种类型的警告

问题描述  在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个工程几百个警告,你看着怎么都不爽吧.我们怎么去掉警告呢? 1. 最直接.最一劳永逸.最安全的方式,直接找到警告的那段代码,改为不警告.这个方式最安全. 可是它有一个问题,就是,当我们很多文件都有这种类型的警告的时候,我们就需要改动很多很多的源码了, 对于不是我们写

小技巧:IIS中的MIME类型

iis|mime|技巧 MIME(Multipurpose Internet Mail Extensions,多目的Internet邮件扩展)是创建用于电子邮件交换,网络文档,及企业网和Internet上的其他应用程序中的文件格式的规范. 每个MIME格式包含一个MIME内容类型和指示存储在这个文件中的数据的子类型.每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio.图象image等,后面定义具体的种类.MIME类型和子类型一般以类型/子类型的形式列出,比如网页的类型"text

在.net中Oracle日期类型的处理

oracle 刚接触Oracle数据库,发现Oracle中的日期类型很难处理,必须为如11-11月-2004,而且必须是汉字月,不知是什么原因,从数据库里读出来再更新日期不变的情况下也不能更新了,真是麻烦,还得转换类型,在网上查了很多帖子,也没有找到好的解决办法,看msdn找到一个类CultureInfo,就写了一个方法转换日期类型. public string rqcl(string rqz) { CultureInfo ci = new CultureInfo("de-DE");

.NET中的特殊类型成员

.NET中的特殊类型成员 ----微软 .NET平台系列文章之三 译文/赵湘宁 在前面的两篇文章中,我们研究了类型的基础知识.本文我们将考察类型能定义的某些特殊成员.在大力简化处理类型及其对象实例需要的语法方面,这些类型有助于面向对象设计. 类型构造器 你已经熟悉了什么是构造器,它负责对象实例状态的初始化.除了实例构造器以外,Microsoft(r).NET公共语言运行时(CLR)还支持类型构造器(也叫做静态构造器.类构造器或类型初始化).类型构造器可被应用到接口,类和数值类型.它允许任何在类型

PB中dynamic调用类型的用法

说到DYNAMIC调用类型,我们先看看对象.属性.函数和事件的引用方法: PowerBuilder 6.0应用程序的开发过程实际上就是各种对象的定义和使用过程.所有对象都有名称,并通过名称相互区分.在PowerScript中,访问对象的属性.函数.事件的方法很简单,就是使用圆点作为标记符,具体来说,访问对象属性的格式为: 对象名.对象属性 例如,把单行编辑框sle_name的用户输入内容送到字符串变量UserEnter的语句可以写成: UserEnter=sle_name.Text 其中,sle

再谈“在STL列表(Lists)中插入不同类型的对象”

看到贵网站上的一篇文章:"在STL列表(Lists)中插入不同类型的对象".我觉得该文回答还没有指出问题的本质,所以本人提出我的观点,恳请指正.本人认为,错误产生的原因在于指针转化过程中,程序没有指出该指针最初的原型,或者说,由于未找到正确的子类函数地址才发生调用错误的,本人原代码如下:用Dev-cpp的g++编译通过. #include<iostream> #include<algorithm> #include <vector> #include

如何动态切换报表中的图表类型

今天被人问到这样一个问题:如何动态地切换报表中的图表类型,例如能不 能同时支持柱状图和饼图,而且用户可以切换? 开发的环境是Reporting Service. 我为此做了一些研究,下面这个范例可以解释这个问题 为了做这个演示,我们需要在Northwind数据库中,准备一个特殊的存储过程,它可以根据国家统计出来销售额. CREATE procedure [dbo].[SaleReportByCountry] @Beginning_Date DateTime, @Ending_Date DateT