为什么要有委托?
先看例子,我设计了个MAC水晶按钮,我希望Windows用户都能使用这个漂亮的水晶按钮。不过难题是,我无法设想当用户按下按钮之后会执行什么动作?是弹出对话框,还是执行某个程序? 这些似乎不是按钮设计者能预测到的,但是又必须加以考虑的。一个解决方法是,设计者除了关注处理按钮自身的效果外,还可能需要留个“后门”给其他用户,而其他用户无需触及这个类的内部实现,就可以改变某些方法的处理规则。比如双击按钮会如何,单击按钮会如何....等等。
从类的提供者的角度来看:我们在设计某个类的时候,可能需要在方法A中执行一些额外的处理,但因为变化太多,或无法预先得知其处理规则,设计者没办法将这部分处理写死在类中,这时候我们就会将这部分交给用户自行处理。换句话说,用户必须注册一个处理函数,当方法A执行的过程中,它会去呼叫(callback)这个被注册的函数。这个函数的正式名称就是“委托方法”。对于类的设计者来说,这种设计方式可以将那些变化不定的细节从类中移除出去,使得类别保持干净稳定。
从类的消费者的角度来看: 我们在使用这个类别的时候,它提供了一种机制,即你在调用某个方法的之前,需要提供一个符合特定签名(signature;即参数与回传值)的方法,才能达到你想要执行的工作。
传统的委托写法
完成一个委托,需要类的提供者和消费者双方一起努力。类的提供者需要完成以下两件事:
1.声明委托类别。你需要使用关键字 delegate 來定义委托类别的名称,以及传入参数和回传值。
注意这里声明的是一个类(Class),而不是一个方法(Method)或者变量。编译器在遇到delegate关键字的时候,会将其转译成一个继承System.MulticastDelegate的类。
2. 声明该委托类别的实例。
3. 通过该实例执行委托方法。
举个为某种商品打价格标签例子,商品重量通过传感器被送入一个数据集,而市场部每天会决定该商品的价格,以及是否促销等等策略。因为定价的方法十分多变,如果写在这个数据集里,势必得不断的修改。所以这里我们用委托来解决这个问题。
分享到:
相关推荐
例如,`List<T>`是C#中的泛型集合,T代表任何类型。 - 泛型类、泛型接口和泛型方法都是泛型在C#中的应用。 4. **异常处理** - 异常是在程序运行时发生的错误,C#使用try-catch块捕获和处理异常,如`try { ... } ...
C# 支持多种集合类型,如数组、列表 (`List<T>`)、字典 (`Dictionary<TKey, TValue>`) 等。例如: ```csharp List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 }; numbers.Add(6); Dictionary<string, int> ...
9. **委托与事件**:C#的事件处理机制,通过委托(Delegate)定义回调方法,用于响应特定事件。 10. **泛型**:提供类型安全的数据容器,如List<T>、Dictionary<TKey, TValue>等,减少代码重复。 11. **异步编程**...
10. **集合与泛型**:C#提供了丰富的集合类(如List<T>、Dictionary<TKey, TValue>),泛型使得集合可以存储任何类型的数据。 11. **异常处理**:C#通过try-catch块处理运行时错误。例如:`try { ... } catch ...
4. 实例86:可能涉及到C#的集合框架,如List<T>、Dictionary<TKey, TValue>等,或者数组(Array)的操作和管理。 5. 实例65:可能讲解了文件和流(Stream)操作,如读写文件、序列化和反序列化,或者是网络通信的...
5. **委托(Delegate)和事件(Event)**:委托是C#中的类型安全的函数指针,常用于实现回调机制。事件则是对象间的通信方式,主要用于发布和订阅模式。 6. **泛型(Generics)**:泛型允许创建可重用的类型,这些...
`List<T>`、`Dictionary<TKey, TValue>`等泛型集合类在日常开发中非常常见,书中会讲解如何有效利用它们。 在C#中,LINQ(Language Integrated Query)提供了内建的查询语言能力,使得在各种数据源上执行查询变得...
本书可能还会介绍C#的事件和委托(event and delegate),这是实现组件之间通信的重要机制。同时,C#的LINQ(Language Integrated Query)允许开发者使用熟悉的SQL查询语法对各种数据源进行操作,极大地提高了代码的...
10. Ex01_48:可能是关于事件和委托(delegate)的示例,这是C#中异步编程和回调函数的关键概念。 通过这些实例,读者可以逐步理解C#的基本语法、面向对象编程思想以及常见编程任务的解决方法。每完成一个例子,...
3. **M005** - 可能涉及到C#的集合与泛型,如List<T>、Dictionary<TKey, TValue>等,泛型提供了一种类型安全的方式,使得集合可以存储任意类型的对象,而无需强制转换。 4. **J022** - 这可能是关于异常处理的示例...
此外,可能会讲解集合类(如List<T>、Dictionary<TKey, TValue>)的使用,以及泛型(Generics)的概念。这一章也可能涉及线程(Threading)和并发处理,这是多任务和高性能应用开发的关键。 4. **第5章**:通常会...
3. **数组与集合**:C#提供了多种数据结构,如一维数组、多维数组、 jagged数组和集合(List<T>、Dictionary<TKey, TValue>等)。理解如何操作和使用这些数据结构对于编写高效代码至关重要。 4. **字符串处理**:在...
4. **事件与委托**:在赛狗游戏中,你可能用到了事件(event)和委托(delegate)来处理狗的移动、比赛结果的更新等交互逻辑,这有助于理解C#的异步编程模型。 5. **控制台应用交互**:通过Console.ReadLine()和...
- 关键字与语法:了解C#中的基本语法结构,如变量声明、数据类型(包括值类型和引用类型)、控制流语句(if、switch、for、while等)和函数定义。 - 面向对象编程基础:类、对象、属性、方法、构造函数、继承、...
10. **泛型接口和委托**:如IEnumerable<T>和Func<T, TResult>等,它们是泛型编程的重要组成部分。 11. **属性(Property)**:C#中的属性提供了一种访问类成员的受保护方式,避免了直接访问字段带来的风险。 12. ...
48. **理解并应用async delegate**:C# 2.0引入的特性,允许异步委托,但现代异步编程通常使用async/await。 49. **理解并应用预定义的类型转换运算符**:C#支持用户定义类型之间的转换运算符,增强类型之间的互...
15. **集合(Collections)**:C#提供了多种集合类型,如ArrayList、List<T>、Dictionary<TKey, TValue>等,用于存储和操作一组对象。 通过阅读"C#编程实例与技巧"的书籍,初学者可以逐步学习并实践以上知识点,...
7. **数组与集合**:学习数组(一维、二维或多维)的使用,以及泛型集合(如List<T>、Dictionary<TKey, TValue>)的概念和操作。 8. **面向对象进阶**:深入理解接口(Interface)、抽象类(Abstract Class)、密封...
- **集合和数组**:使用List<T>、Dictionary<TKey, TValue>等集合类,以及一维、多维数组的操作。 - **文件和流操作**:学习如何读写文件,使用内存流和磁盘流进行数据交换。 - **异常处理**:通过实例了解如何抛出...
### C# 3.0 锐利体验系列课程(2):Lambda表达式 #### Lambda表达式概述 在C# 3.0中,Lambda表达式作为一种强大的语法特性被引入,它极大地简化了代码编写过程,并提高了代码的可读性和维护性。Lambda表达式能够以...