【LSP】NET委托,事件和Lambda表达式

hcat   ·   发表于 10天前   ·   编程代码

委托
委托是什么?
委托是一种引用类型(其实就是一个类,继承MulticastDelegate特殊的类。),表示对具有特定参数列表和返回类型的方法的引用。

每个委托提供Invoke方法, BeginInvoke和EndInvoke异步方法

为什么需要委托?
委托可以将方法(即逻辑)作为参数;
逻辑解耦,保持稳定。
代码复用,保证项目规范。
如何使用委托?
如何声明、实例化和使用委托
声明委托

delegate void Del(string str);
static void Notify(string name)
{
Console.WriteLine($"Notification received for: {name}");
}
实例化委托

Del del1 = new Del(Notify);
//C# 2.0
Del del2 = Notify;
调用委托

del1.Invoke("小明");
del2("小明");
其他使用委托

//C# 2.0使用匿名方法来声明和实例化委托
Del del3 = delegate(string name)
{ Console.WriteLine($"Notification received for: {name}"); };
//C# 3.0使用lambda表达式声明和实例化委托
Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
简化开发过程,.NET 包含一组委托类型:

Action<> 具有参数且不返回值。
Func<> 具有参数且返回由参数指定的类型的值。
Predicate<> 用于确定参数是否满足委托条件的情况。
实际案例
代码:

Lambda表达式
Lambda是什么?
Lambda就是使用委托的更方便的语法。

//C# 2.0使用匿名方法来声明和实例化委托
Del del3 = delegate(string name)
{ Console.WriteLine($"Notification received for: {name}"); };
//C# 3.0使用lambda表达式声明和实例化委托
Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
为什么需要Lambda?
简化开发过程,并不会影响运行性能。

如何使用Lambda?
表达式lambda基本形式:

//仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的
(input-parameters) => expression
使用空括号指定零个输入参数:

Action line = () => Console.WriteLine();
括号内的两个或更多输入参数使用逗号加以分隔:

Func testForEquality = (x, y) => x == y;
语句lambda

(input-parameters) => { }
语句 lambda 的主体可以包含任意数量的语句;

Action greet = name =>
{
string greeting = $"Hello {name}!";
Console.WriteLine(greeting);
};
greet("World");
// Output:
// Hello World!
使用匿名委托和lambda代码:

事件
事件是什么?
事件是一种特殊的委托类型,主要用于消息或通知的传递。事件只能从事件的发布类型中调用,并且通常基于EventHandler委托,该委托具有代表事件发送者的对象和System.EventArgs派生的类,其中包含有关事件的数据。

何时使用委托和事件?
侦听事件是可选的:如果你的代码必须调用由订阅服务器提供的代码,则应使用基于委托的设计。如果你的代码在不调用任何订阅服务器的情况下可完成其所有工作,则应使用基于事件的设计。
返回值需要委托:用于事件的委托均具有无效的返回类型,事件处理程序通过修改事件参数对象的属性将信息传回到事件源。
事件具有专用调用:包含事件的类以外的类只能添加和删除事件侦听器;只有包含事件的类才能调用事件。

14 Reply   |  Until 9天前 | 1363 View

北斗星的爱
发表于 10天前

抢占一楼[滑稽][滑稽][滑稽]

评论列表

  • 加载数据中...

编写评论内容

强哥哥
发表于 1970-1-19

大哥来了!

评论列表

  • 加载数据中...

编写评论内容

少司⁡命
发表于 10天前

小白表示看不懂

评论列表

  • 加载数据中...

编写评论内容

10086
发表于 10天前

哎呀[吐舌][吐舌],尴尬啊我

评论列表

  • 加载数据中...

编写评论内容

1679644933
发表于 10天前

其实这个委托呢,不难理解的

评论列表

  • 加载数据中...

编写评论内容

administrator
发表于 10天前

大哥是真正的程序猿[玫瑰]

评论列表

  • 加载数据中...

编写评论内容

modu
发表于 10天前

谦虚了[滑稽][滑稽][滑稽]

评论列表

  • 加载数据中...

编写评论内容

kukugou
发表于 10天前

ugc不需要精贴吗[咦]

评论列表

  • 加载数据中...

编写评论内容

1008612
发表于 10天前

所谓委托,就是好比,张三这个正在写作业,然后你因为有事,你写不了,你交给他写,一般使用是静态,因为静态可以共享,实例化就不用说特别了,如果你不用静态的话,也可以,但是有一大堆警告⚠️[滑稽][滑稽][滑稽]

评论列表

  • 加载数据中...

编写评论内容

203266168出黑
发表于 10天前

想问问ugc多少个像大哥这样的程序猿呢[玫瑰]

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content