服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 浅析C# 委托(Delegate)

浅析C# 委托(Delegate)

2022-09-24 16:22菜鸟教程 C#

这篇文章主要介绍了C# 委托(Delegate)的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

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

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

声明委托(Delegate)

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

例如,假设有一个委托:

?
1
public delegate int MyDelegate (string s);

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

声明委托的语法如下:

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

实例化委托(Delegate)

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

?
1
2
3
4
public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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),也叫组播。下面的程序演示了委托的多播:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 可用于引用带有一个字符串作为输入的方法,并不返回任何东西。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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)的资料请关注服务器之家其它相关文章!

原文链接:https://www.runoob.com/csharp/csharp-delegate.html

延伸 · 阅读

精彩推荐
  • C#Unity调用手机摄像机识别二维码

    Unity调用手机摄像机识别二维码

    这篇文章主要为大家详细介绍了Unity调用手机摄像机识别二维码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    C-h-h5462022-07-29
  • C#C#实现远程关闭计算机或重启计算机的方法

    C#实现远程关闭计算机或重启计算机的方法

    这篇文章主要介绍了C#实现远程关闭计算机或重启计算机的方法,涉及C#远程连接及系统命令的调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧10432021-10-20
  • C#C#中list用法实例

    C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    smartsmile201210902021-11-26
  • C#C#实现将程序运行信息写入日志的方法

    C#实现将程序运行信息写入日志的方法

    这篇文章主要介绍了C#实现将程序运行信息写入日志的方法,可实现将程序运行信息写入日志并存储在Debug目录下的"/Log/PRG"下的功能,涉及C#针对日志的相关写...

    北风其凉8142021-10-19
  • C#c#通用登录模块分享

    c#通用登录模块分享

    这是一款简单的ASP.NETC#注册登录模块制作思路,非常简单实用,虽然没怎么考虑登陆的安全性,但作为C#的朋友学习交流使用。...

    C#教程网6372021-11-29
  • C#在C#使用字典存储事件示例及实现自定义事件访问器

    在C#使用字典存储事件示例及实现自定义事件访问器

    这篇文章主要介绍了在C#使用字典存储事件示例及实现自定义事件访问器的方法,是C#事件编程中的基础知识,需要的朋友可以参考下...

    C#教程网5932021-11-11
  • C#c# 所有类型都从Object类型派生

    c# 所有类型都从Object类型派生

    所有的类型最终从object派生,每一个类型都有一组最基本的方法...

    C#教程网6162021-04-14
  • C#C#实现简单俄罗斯方块

    C#实现简单俄罗斯方块

    这篇文章主要为大家详细介绍了C#实现简单俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    q6459896378842022-08-29