浅析C# 委托(Delegate)

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

声明委托(Delegate)

委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。

例如,假设有一个委托:

public delegate int MyDelegate (string s);

上面的委托可被用于引用任何一个带有一个单一的 string 参数的方法,并返回一个 int 类型变量。

声明委托的语法如下:

delegate <return type> <delegate-name> <parameter list>

实例化委托(Delegate)

一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

下面的实例演示了委托的声明、实例化和使用,该委托可用于引用带有一个整型参数的方法,并返回一个整型值。

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
  class TestDelegate
  {
   static int num = 10;
   public static int AddNum(int p)
   {
     num += p;
     return num;
   }

   public static int MultNum(int q)
   {
     num *= q;
     return num;
   }
   public static int getNum()
   {
     return num;
   }

   static void Main(string[] args)
   {
     // 创建委托实例
     NumberChanger nc1 = new NumberChanger(AddNum);
     NumberChanger nc2 = new NumberChanger(MultNum);
     // 使用委托对象调用方法
     nc1(25);
     Console.WriteLine("Value of Num: {0}", getNum());
     nc2(5);
     Console.WriteLine("Value of Num: {0}", getNum());
     Console.ReadKey();
   }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 35
Value of Num: 175

委托的多播(Multicasting of a Delegate)

委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面的程序演示了委托的多播:

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
  class TestDelegate
  {
   static int num = 10;
   public static int AddNum(int p)
   {
     num += p;
     return num;
   }

   public static int MultNum(int q)
   {
     num *= q;
     return num;
   }
   public static int getNum()
   {
     return num;
   }

   static void Main(string[] args)
   {
     // 创建委托实例
     NumberChanger nc;
     NumberChanger nc1 = new NumberChanger(AddNum);
     NumberChanger nc2 = new NumberChanger(MultNum);
     nc = nc1;
     nc += nc2;
     // 调用多播
     nc(5);
     Console.WriteLine("Value of Num: {0}", getNum());
     Console.ReadKey();
   }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of Num: 75

委托(Delegate)的用途

下面的实例演示了委托的用法。委托 printString 可用于引用带有一个字符串作为输入的方法,并不返回任何东西。

我们使用这个委托来调用两个方法,第一个把字符串打印到控制台,第二个把字符串打印到文件:

using System;
using System.IO;

namespace DelegateAppl
{
  class PrintString
  {
   static FileStream fs;
   static StreamWriter sw;
   // 委托声明
   public delegate void printString(string s);

   // 该方法打印到控制台
   public static void WriteToScreen(string str)
   {
     Console.WriteLine("The String is: {0}", str);
   }
   // 该方法打印到文件
   public static void WriteToFile(string s)
   {
     fs = new FileStream("c:\\message.txt", FileMode.Append, FileAccess.Write);
     sw = new StreamWriter(fs);
     sw.WriteLine(s);
     sw.Flush();
     sw.Close();
     fs.Close();
   }
   // 该方法把委托作为参数,并使用它调用方法
   public static void sendString(printString ps)
   {
     ps("Hello World");
   }
   static void Main(string[] args)
   {
     printString ps1 = new printString(WriteToScreen);
     printString ps2 = new printString(WriteToFile);
     sendString(ps1);
     sendString(ps2);
     Console.ReadKey();
   }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:

The String is: Hello World

以上就是浅析C# 委托(Delegate)的详细内容,更多关于C# 委托(Delegate)的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#委托delegate实例解析

    所谓c#的委托就是说把函数当参数来传递. 这个在js完全就用不着搞什么委托东西,直接转就是了.而对于C#来说则不是这样! 一个函数,如果它的参数是函数,那么是这样子写的 : public void method(Action<string, Int32> voidMethod, Func<string, Int32> returnMethod) Action<string, Int32> voidMethod 意思是说这个将被传进来的函数是一个没有return的函数,就

  • C#事件处理和委托event delegate实例简述

    本文实例讲述了C#事件处理和委托event delegate,分享给大家供大家参考.具体方法如下: 以下仅仅是用最简单的方式表示事件,实际应用可能是不同窗体之间相互通知某些操作,达到触发. 首先声明一个degate的 EventHandler 参数可以没有 一个或多个 但是触发和使用一定要匹配. 创建一个该EvenHandler的实例a 在程序建立或你需要的时候产生一个事件触发申明: a += new EventHandler(d); public delegate void EventHand

  • C#中委托(Delegates)的使用方法详解

    1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解: (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.调用委托的时候,委托包含的所有方法将被执行. 2. 委托类型的定义 委托是类型,就

  • C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法.分享给大家供大家参考.具体分析如下: 关于Delegate[代理.委托]是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名方法.lambda表达式. 现在我就从一个最简单最实用的一个小例子出发分析一下Delegate的使用. 现在有两个窗体Form1和Form2. 两个按钮Button1(Form)和Button2(Form2). Form1的代码: private void button

  • C#中的delegate委托类型基本学习教程

    委托 delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型.在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联.你可以通过委托实例调用方法. 委托用于将方法作为参数传递给其他方法.事件处理程序就是通过委托调用的方法.你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法.下面的示例演示了一个委托声明: public delegate int PerformCalculation(int x, int y); 可将任何

  • C# 委托(delegate) 的小例子

    代码如下: 复制代码 代码如下: static void Main(string[] args)        {           Console.WriteLine(Exec(GetSet));           Console.ReadKey();        }        //定义委托,用于将方法做为参数传给Exec.        public delegate string GetResultDelegate();        public static string G

  • 浅析C# 委托(Delegate)

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针.委托(Delegate) 是存有对某个方法的引用的一种引用类型变量.引用可在运行时被改变. 委托(Delegate)特别用于实现事件和回调方法.所有的委托(Delegate)都派生自 System.Delegate 类. 声明委托(Delegate) 委托声明决定了可由该委托引用的方法.委托可指向一个与其具有相同标签的方法. 例如,假设有一个委托: public delegate int MyDelegate (string

  • 解析.Net 4.0 中委托delegate的使用详解

    .Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果.但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针:而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法的委托.一. 先来看下委托的定义:如下C#代码定义委托public delegate void DoSomething(int times);委托的定

  • javascript委托(Delegate)blur和focus用法实例分析

    本文实例讲述了javascript委托(Delegate)blur和focus用法.分享给大家供大家参考.具体分析如下: Opera (9.5b) 对于所有的focus和blur事件,不能正确的触发两次: 因此,focus和blur事件的处理函数可以被委派到事件的捕获阶段. 例子1(列表类): 复制代码 代码如下: <ol id="列表">   <li><a href="#">列表项1</a>     <ol&g

  • 深入理解C#委托delegate的使用

    目录 1.什么是委托 2:委托的实现 命名法委托 静态方法的实例化委托 实例化方法的委托 多播委托 匿名委托 什么时候适用委托 1.什么是委托 委托就是委托某个方法来实现具体的功能,类似于:甲方委托乙方去实现需求:出租房屋人委托中介为其出租房屋. 委托是一种引用类型,从数据结构上来讲:委托和类一样,都是一直用户自定义类型. 2:委托的实现 委托是对方法的抽象和封装.委托对象实质上代表了方法的引用(即内存地址)他存储的就是一系列具有相同签名和返回类型的方法的地址 可以理解为函数的一个包装,它使得c

  • C#匿名方法与Delegate类型转换错误分析

    本文实例分析了C#匿名方法与Delegate类型转换错误.分享给大家供大家参考.具体分析如下: 问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method); public IAsyncRe

  • 详解C#中通过委托来实现回调函数功能的方法

    委托(delegate)是一种可以把引用存储为函数的类型,这类似于c++中的函数指针. 回调函数 c++中的回调函数,就是用函数指针来实现的.类似的,c#中用委托,来实现回调函数的功能. 回调函数为什么被称为回调函数?比如你调用了一个函数,那么就叫调用,但是如果你在调用一个函数的时候,还需要把一个函数提供给该函数,让这个函数来调用你的函数,那么你提供的这个函数就被称为回调函数(callback). 对于python这样的动态语言而言,就没有c#,c++提供特殊的语法实现回调函数,因为在pytho

随机推荐