C# 委托 事件 匿名方法
2023-09-14 09:03:16 时间
// 委托其实就相当于一个类型。这里,类型的名字叫BinaryOp
public delegate int BinaryOp(int x, int y);
static public int Add(int x, int y)
return x + y;
static void Main()
// 创建一个BinaryOp类型的实例,用静态Add方法初始化
BinaryOp d = new BinaryOp(Add);
Console.WriteLine(d(10, 10));
Console.ReadLine();
}
原文地址 拓展:点击打开链接
可以这样说,委托和事件经常一起使用,感觉挺麻烦的,而且觉得委托已经挺好了,为什么还要加入事件呢?搞得挺复杂的。
* 委托示例一 * 说明:此段程序主要是将委托作为方法的参数传入方法中,使得具体调用时再根据需要为方法赋值。
输出结果为:20
上面是静态方法的委托,下面再来看一个实例方法的委托。class MyClass private string name; public MyClass(string name) this.name = name; public void DisplayName() Console.WriteLine("{0}", name); class Program // 委托其实就相当于一个类型。这里,类型的名字叫SimpleDelegate public delegate void SimpleDelegate(); static void Main() MyClass a = new MyClass("A"); MyClass b = new MyClass("B"); // 用实例方法DisplayName初始化 SimpleDelegate d = new SimpleDelegate(a.DisplayName); d(); d = new SimpleDelegate(b.DisplayName); d(); Console.ReadLine(); }
输出结果为:A
B(*) 事件
委托是个类型,而事件是个成员。看下面的代码:
namespace ConsoleApplication1 public class SimpleMath public delegate int BinaryOp(int a, int b); // 定义Binary类型 public event BinaryOp BinaryEvent; // 定义BinaryEvent成员 public int Add(int a, int b) { return a + b; } public int Substract(int a, int b) { return a - b; } public int Calculate() // Raise the event by using the () operator. return BinaryEvent(1, 2); // 只能在定义事件的类的内部调用,如果写在外面会编译不过 class Program static void Main() SimpleMath sm = new SimpleMath(); // sm.BinaryEvent(1, 2); 编译错误!只能在定义事件的类的内部调用 // 下面两种注册方法效果是一样的,相当于注册了两遍,也的确会依序执行两遍 sm.BinaryEvent += new SimpleMath.BinaryOp(sm.Add); sm.BinaryEvent += sm.Add; Console.WriteLine(sm.Calculate()); // 结果是3 // 下面两种注册方法效果是一样的,相当于注册了两遍,也的确会依序执行两遍 sm.BinaryEvent += new SimpleMath.BinaryOp(sm.Substract); sm.BinaryEvent += sm.Substract; Console.WriteLine(sm.Calculate()); // -1, 只保留最后一次调用的返回值(3,3,-1,-1) Console.ReadLine(); }
输出结果为:3
-1
(*) 匿名方法
匿名方法的作用是使代码更简化,方便了程序员。如果没有匿名方法,则定义一套事件监听需要这样:
class Program public delegate void SomeDelegate(); // 定义委托 static void Main() SomeType obj = new SomeType(); obj.SomeEvent += new SomeDelegate(MyEventHandler); // 一般来说,定义的MyEventHandler方法只用来响应事件,只在上面那一处地方使用 public static void MyEventHandler() // 定义委托所调用的方法 }上面的代码比较啰嗦,尤其是为委托和它所调用的方法起名字比较费劲我觉得。有了匿名方法以后,仅需要这样:
class Program static void Main() SomeType obj = new SomeType(); obj.SomeEvent += delegate{ // 实现事件处理逻辑 }; // 注意要有分号 }与上一段代码相比,省去了SomeDelegate和MyEventHandler的定义。
原文地址 拓展:点击打开链接
可以这样说,委托和事件经常一起使用,感觉挺麻烦的,而且觉得委托已经挺好了,为什么还要加入事件呢?搞得挺复杂的。
* 委托示例一 * 说明:此段程序主要是将委托作为方法的参数传入方法中,使得具体调用时再根据需要为方法赋值。
相关文章
- C# 连接SQLServer数据库及登录验证知识
- 12篇学通C#网络编程——第三篇 HTTP应用编程(下)
- C#语法之Linq查询基础二
- C#基础知识详解之【字段与属性】
- Win10系列:C#应用控件基础5
- C#委托和事件详解
- 编写高质量代码改善C#程序的157个建议[C#闭包的陷阱、委托、事件、事件模型]
- C#--SelectedIndexChanged事件, SelectedValueChanged事件和SelectionChangeCommitted事件的区别及联系
- C#继承小结——面向对象编程的三大机制之一
- C#委托和事件机制
- C# 各版本的新特性
- C# 清除事件绑定的函数
- C# 设计时动态改变实体在PropertyGrid中显示出来的属性
- 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系
- C# DataSet.Clear 方法
- atitit.木马病毒webshell的原理and设计 java c# .net php.
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
- C# 事件(Event)
- (五十)c#Winform自定义控件-滑块-HZHControls
- C#窗体程序winform新手学习笔记(一)
- 在C#里传送事件的参数
- C# 日期转换AM/PM
- C#中IEumerable的简单了解