首页 > 编程语言 >C#委托的20种表达方式,每一种优缺点和应用场景

C#委托的20种表达方式,每一种优缺点和应用场景

时间:2023-07-25 22:11:20浏览次数:40  
标签:20 委托 C# 优缺点 value c# myDelegate Console MyDelegate

C#委托有多种表达方式,每一种都有各自的优缺点和适用场景。以下为常见的20种表达方式:

1. 声明委托类型,并使用委托关键字进行定义:
```c#
delegate void MyDelegate(int value);
```
优点:简单明了,易于理解和使用。
缺点:需要额外的代码定义委托。

2. 使用匿名方法:
```c#
MyDelegate myDelegate = delegate(int value) { Console.WriteLine(value); };
```
优点:简洁,无需显式定义委托。
缺点:不能重用匿名方法。

3. 使用Lambda表达式:
```c#
MyDelegate myDelegate = (value) => { Console.WriteLine(value); };
```
优点:简洁,可用于替代匿名方法。
缺点:不能重用Lambda表达式。

4. 使用命名方法:
```c#
void MyMethod(int value)
{
Console.WriteLine(value);
}

MyDelegate myDelegate = MyMethod;
```
优点:便于重用和维护,可在不同的地方使用同一个方法。
缺点:需要通过方法名来引用委托。

5. 使用实例方法:
```c#
class MyClass
{
public void MyMethod(int value)
{
Console.WriteLine(value);
}
}

MyClass myObject = new MyClass();
MyDelegate myDelegate = myObject.MyMethod;
```
优点:可以将对象的实例方法作为委托进行调用。
缺点:需要先创建对象实例。

6. 使用静态方法:
```c#
class MyClass
{
public static void MyMethod(int value)
{
Console.WriteLine(value);
}
}

MyDelegate myDelegate = MyClass.MyMethod;
```
优点:可以将类的静态方法作为委托进行调用。
缺点:无法访问非静态类成员。

7. 使用多播委托:
```c#
MyDelegate myDelegate1 = (value) => { Console.WriteLine(value); };
MyDelegate myDelegate2 = (value) => { Console.WriteLine(value * 2); };
MyDelegate myDelegate = myDelegate1 + myDelegate2;
```
优点:可以将多个委托合并为一个委托进行调用。
缺点:可能会导致难以预测的行为和性能问题。

8. 使用null委托:
```c#
MyDelegate myDelegate = null;
```
优点:可用于初始化委托变量。
缺点:无法调用空委托。

9. 使用泛型委托:
```c#
delegate void MyDelegate<T>(T value);
MyDelegate<int> myDelegate = (value) => { Console.WriteLine(value); };
```
优点:可以定义适用于不同类型的委托。
缺点:需要声明和使用泛型类型。

10. 使用Func<>委托:
```c#
Func<int, int, int> myDelegate = (x, y) => { return x + y; };
```
优点:可以定义具有多个参数和返回值的委托。
缺点:仅适用于特定的函数签名。

11. 使用Action<>委托:
```c#
Action<int> myDelegate = (value) => { Console.WriteLine(value); };
```
优点:用于不返回任何值的方法。
缺点:仅适用于特定的函数签名。

12. 使用Predicate<>委托:
```c#
Predicate<int> myDelegate = (value) => { return value > 0; };
```
优点:用于返回布尔值的方法。
缺点:仅适用于特定的函数签名。

13. 使用委托的BeginInvoke和EndInvoke方法:
```c#
MyDelegate myDelegate = (value) => { Console.WriteLine(value); };
myDelegate.BeginInvoke(10, null, null);
```
优点:可以异步调用委托方法。
缺点:需要额外处理异步操作。

14. 使用事件和事件处理程序:
```c#
class MyEventClass
{
public event MyDelegate MyEvent;

public void InvokeEvent(int value)
{
MyEvent?.Invoke(value);
}
}

MyEventClass myEventObject = new MyEventClass();
myEventObject.MyEvent += (value) => { Console.WriteLine(value); };
```
优点:用于建立发布者和订阅者之间的通信。
缺点:需要显式定义事件和事件处理程序。

15. 使用委托的异步回调:
```c#
MyDelegate myDelegate = (value) => { Console.WriteLine(value); };
IAsyncResult result = myDelegate.BeginInvoke(10, (asyncResult) => { myDelegate.EndInvoke(asyncResult); }, null);
```
优点:可以在异步操作完成后进行回调处理。
缺点:复杂,需要处理回调方法和参数。

16. 使用委托的过滤和排序算法:
```c#
List<int> numbers = new List<int> { 3, 1, 2, 4 };
List<int> filteredNumbers = numbers.FindAll((value) => { return value > 2; });
filteredNumbers.Sort();
```
优点:可用于筛选和排序集合中的元素。
缺点:需要传递筛选和排序的条件。

17. 使用委托进行事件触发:
```c#
class MyEventClass
{
public event MyDelegate MyEvent;

public void InvokeEvent(int value)
{
MyEvent?.Invoke(value);
}
}

MyEventClass myEventObject = new MyEventClass();
myEventObject.MyEvent += (value) => { Console.WriteLine(value); };
myEventObject.InvokeEvent(10);
```
优点:可以通过事件触发委托的调用。
缺点:需要显式定义事件和事件处理程序。

18. 使用委托进行延迟加载:
```c#
class LazyLoadingClass
{
private Lazy<int> lazyValue = new Lazy<int>(() =>
{
Console.WriteLine("Lazy loading...");
return 10;
});

public int Value => lazyValue.Value;
}

LazyLoadingClass lazyObject = new LazyLoadingClass();
Console.WriteLine(lazyObject.Value);
```
优点:可以在需要时延迟加载委托。
缺点:需要使用Lazy类来支持延迟加载。

19. 使用委托进行错误处理:
```c#
try
{
MyDelegate myDelegate = (value) => { throw new Exception("Error"); };
myDelegate(10);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
```
优点:可以在委托中捕获和处理异常。
缺点:需要使用try-catch块进行错误处理。

20. 使用委托进行并行操作:
```c#
List<int> numbers = new List<int> { 1, 2, 3, 4 };
Parallel.ForEach(numbers, (value) => { Console.WriteLine(value); });
```
优点:可以并行处理集合中的元素。
缺点:需要使用并行操作的方式(例如Parallel类)。


标签:20,委托,C#,优缺点,value,c#,myDelegate,Console,MyDelegate
From: https://www.cnblogs.com/VisionGo/p/17581180.html

相关文章

  • C++ 单例模式三种写法
    #include<iostream>#include"Apple.h"#include"Singleton.h"#include"ActivityManager.h"#include"ResourceManager.h"usingnamespaceMySpace;intmain(){Apple::abc=10;//参考:https://blog.csdn.n......
  • CF1853C Ntarsis' Set
    Miku一道逆向思维的题目。我们假设最后的最小的数是个1,放在第一个位置上,然后我们往数列开头按照规则插入0,其中应该插在这个1后面的,我们视为无效插入,插在这个1前面的,我们视为有效插入。显然随着这个1的后退,每一次有效插入的0越来越多。那么,什么时候的插入是有效的呢,就是当1的位......
  • Introduction to Embedding for Retrieval 向量化召回简介
    引言搜广推类似场景都是retrieval+ranking两阶段方式,前者用从海量候选粗选一轮,后者再用负载模型,是效果、延迟和机器资源的trade-off的产物。retrieval广泛使用embedding+ANN方案,比起invertindex个性化更强。embedding动机,word2vec用向量表示高维的one-hot编码,向量的距......
  • 02_CSS
    1.CSS1.简介1.是什么CascadingStylesheets,层叠样式表CSS可以用来为网页创建样式表,通过样式表可以对网页进行装饰。所谓层叠,可以将整个网页想象成一层一层的结构,层次高的将会覆盖层次低的,CSS可以分别为网页的各个层次设置样式。2.能做什么修饰美化html网页;外部样式表可以......
  • 03_JavaScript
    一.JavaScript概述1.简介JavaScript一种解释性脚本语言,是一种动态类型、弱类型、基于原型继承的语言,内置支持类型。它的解释器被称为JavaScript引擎,作为浏览器的一部分,广泛用于客户端的脚本语言,用来给HTML网页增加动态功能。脚本语言是为了缩短传统的编写-编译-链接-运行(edit-......
  • 初识C数据结构之“*”和“&”(指针、解引用、取地址、引用)
    这天小阿杰又在看C数据结构——顺序表中几个传参的小小的内容引起了小阿杰大大的疑惑:(教材为严蔚敏老师的《数据结构(C语言版第2版)》)可怜的小阿杰当时只知道&取地址……后来查阅资料才对其中略知一二,那咱们下面就来唠唠。顺便提一下,引用&只在C++中有,C语言......
  • Llama 2 来袭 - 在 Hugging Face 上玩转它
    引言今天,Meta发布了Llama2,其包含了一系列最先进的开放大语言模型,我们很高兴能够将其全面集成入HuggingFace,并全力支持其发布。Llama2的社区许可证相当宽松,且可商用。其代码、预训练模型和微调模型均于今天发布了......
  • AGC006F Blackout
    AGC006FBlackout如果一个格子\((x,y)\)是黑色的,那么构建边\(x\rightarrowy\),接下来对于每个弱连通块分类讨论:图中有自环则弱连通块必然形成一个完全图证明:从自环开始归纳,将自环视为一个点数为\(1\)的完全图,接下来扩展完全图时,分类讨论:从完全图中一个点\(u\),存......
  • Cmake入门
    构建一个最简单的Cmake demo。其中最基础的三个命令是:cmake_minimum_required()project()add_executable()哪怕只有这三个命令都可以 构成一个CMake工程。下面介绍下命令地用法:cmake_minimum_required()cmake_minimum_required(VERSION<min>[...<policy_max>][F......
  • ASP.NET Core Identity 系列之一
    ASP.NETCoreIdentity提供给我们一组工具包和API,它能帮助我们应用程序创建授权和认证功能,也可以用它创建账户并使用用户名和密码进行登录,同时也提供了角色和角色管理功能。ASP.NETCoreIdentity使用SQLServer/第三方数据库存储用户名和密码,角色和配置数据这系列中我们主要使用......