`

C# 语法书 <2> 委托 delegate

阅读更多
为什么要有委托?

先看例子,我设计了个MAC水晶按钮,我希望Windows用户都能使用这个漂亮的水晶按钮。不过难题是,我无法设想当用户按下按钮之后会执行什么动作?是弹出对话框,还是执行某个程序? 这些似乎不是按钮设计者能预测到的,但是又必须加以考虑的。一个解决方法是,设计者除了关注处理按钮自身的效果外,还可能需要留个“后门”给其他用户,而其他用户无需触及这个类的内部实现,就可以改变某些方法的处理规则。比如双击按钮会如何,单击按钮会如何....等等。

从类的提供者的角度来看:我们在设计某个类的时候,可能需要在方法A中执行一些额外的处理,但因为变化太多,或无法预先得知其处理规则,设计者没办法将这部分处理写死在类中,这时候我们就会将这部分交给用户自行处理。换句话说,用户必须注册一个处理函数,当方法A执行的过程中,它会去呼叫(callback)这个被注册的函数。这个函数的正式名称就是“委托方法”。对于类的设计者来说,这种设计方式可以将那些变化不定的细节从类中移除出去,使得类别保持干净稳定。

从类的消费者的角度来看: 我们在使用这个类别的时候,它提供了一种机制,即你在调用某个方法的之前,需要提供一个符合特定签名(signature;即参数与回传值)的方法,才能达到你想要执行的工作。

传统的委托写法

完成一个委托,需要类的提供者和消费者双方一起努力。类的提供者需要完成以下两件事:

1.声明委托类别。你需要使用关键字 delegate 來定义委托类别的名称,以及传入参数和回传值。

注意这里声明的是一个类(Class),而不是一个方法(Method)或者变量。编译器在遇到delegate关键字的时候,会将其转译成一个继承System.MulticastDelegate的类。

2. 声明该委托类别的实例。

3. 通过该实例执行委托方法。

举个为某种商品打价格标签例子,商品重量通过传感器被送入一个数据集,而市场部每天会决定该商品的价格,以及是否促销等等策略。因为定价的方法十分多变,如果写在这个数据集里,势必得不断的修改。所以这里我们用委托来解决这个问题。
分享到:
评论

相关推荐

    C#语言参考 C#的语法书

    例如,`List&lt;T&gt;`是C#中的泛型集合,T代表任何类型。 - 泛型类、泛型接口和泛型方法都是泛型在C#中的应用。 4. **异常处理** - 异常是在程序运行时发生的错误,C#使用try-catch块捕获和处理异常,如`try { ... } ...

    c#入门语法.docx

    C# 支持多种集合类型,如数组、列表 (`List&lt;T&gt;`)、字典 (`Dictionary&lt;TKey, TValue&gt;`) 等。例如: ```csharp List&lt;int&gt; numbers = new List&lt;int&gt;() { 1, 2, 3, 4, 5 }; numbers.Add(6); Dictionary&lt;string, int&gt; ...

    30个c# 实用程序源代码

    9. **委托与事件**:C#的事件处理机制,通过委托(Delegate)定义回调方法,用于响应特定事件。 10. **泛型**:提供类型安全的数据容器,如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等,减少代码重复。 11. **异步编程**...

    C#语言规范(中文CHM)

    10. **集合与泛型**:C#提供了丰富的集合类(如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;),泛型使得集合可以存储任何类型的数据。 11. **异常处理**:C#通过try-catch块处理运行时错误。例如:`try { ... } catch ...

    c#范例宝典

    4. 实例86:可能涉及到C#的集合框架,如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等,或者数组(Array)的操作和管理。 5. 实例65:可能讲解了文件和流(Stream)操作,如读写文件、序列化和反序列化,或者是网络通信的...

    Essential c#

    5. **委托(Delegate)和事件(Event)**:委托是C#中的类型安全的函数指针,常用于实现回调机制。事件则是对象间的通信方式,主要用于发布和订阅模式。 6. **泛型(Generics)**:泛型允许创建可重用的类型,这些...

    C#技术内幕书中的代码

    `List&lt;T&gt;`、`Dictionary&lt;TKey, TValue&gt;`等泛型集合类在日常开发中非常常见,书中会讲解如何有效利用它们。 在C#中,LINQ(Language Integrated Query)提供了内建的查询语言能力,使得在各种数据源上执行查询变得...

    C#入门经典(2)

    本书可能还会介绍C#的事件和委托(event and delegate),这是实现组件之间通信的重要机制。同时,C#的LINQ(Language Integrated Query)允许开发者使用熟悉的SQL查询语法对各种数据源进行操作,极大地提高了代码的...

    C# 范例宝典 (1000个例子)

    10. Ex01_48:可能是关于事件和委托(delegate)的示例,这是C#中异步编程和回调函数的关键概念。 通过这些实例,读者可以逐步理解C#的基本语法、面向对象编程思想以及常见编程任务的解决方法。每完成一个例子,...

    Visual C# 2005编程技巧大全 源代码_part_2.rar

    3. **M005** - 可能涉及到C#的集合与泛型,如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等,泛型提供了一种类型安全的方式,使得集合可以存储任意类型的对象,而无需强制转换。 4. **J022** - 这可能是关于异常处理的示例...

    C#应用程序开发源代码

    此外,可能会讲解集合类(如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;)的使用,以及泛型(Generics)的概念。这一章也可能涉及线程(Threading)和并发处理,这是多任务和高性能应用开发的关键。 4. **第5章**:通常会...

    C#入门经典章节后答案

    3. **数组与集合**:C#提供了多种数据结构,如一维数组、多维数组、 jagged数组和集合(List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等)。理解如何操作和使用这些数据结构对于编写高效代码至关重要。 4. **字符串处理**:在...

    head first C# 赛狗日 完整项目

    4. **事件与委托**:在赛狗游戏中,你可能用到了事件(event)和委托(delegate)来处理狗的移动、比赛结果的更新等交互逻辑,这有助于理解C#的异步编程模型。 5. **控制台应用交互**:通过Console.ReadLine()和...

    完整讲述C sharp 《C# 完全手册》

    - 关键字与语法:了解C#中的基本语法结构,如变量声明、数据类型(包括值类型和引用类型)、控制流语句(if、switch、for、while等)和函数定义。 - 面向对象编程基础:类、对象、属性、方法、构造函数、继承、...

    Microsoft C# 語言白皮書(2002)

    10. **泛型接口和委托**:如IEnumerable&lt;T&gt;和Func&lt;T, TResult&gt;等,它们是泛型编程的重要组成部分。 11. **属性(Property)**:C#中的属性提供了一种访问类成员的受保护方式,避免了直接访问字段带来的风险。 12. ...

    Effective c#中文版

    48. **理解并应用async delegate**:C# 2.0引入的特性,允许异步委托,但现代异步编程通常使用async/await。 49. **理解并应用预定义的类型转换运算符**:C#支持用户定义类型之间的转换运算符,增强类型之间的互...

    C#编程实例与技巧 C#编程入门

    15. **集合(Collections)**:C#提供了多种集合类型,如ArrayList、List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等,用于存储和操作一组对象。 通过阅读"C#编程实例与技巧"的书籍,初学者可以逐步学习并实践以上知识点,...

    C#入门经典 附录程序

    7. **数组与集合**:学习数组(一维、二维或多维)的使用,以及泛型集合(如List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;)的概念和操作。 8. **面向对象进阶**:深入理解接口(Interface)、抽象类(Abstract Class)、密封...

    C#入门经典第六版pdf和工程代码

    - **集合和数组**:使用List&lt;T&gt;、Dictionary&lt;TKey, TValue&gt;等集合类,以及一维、多维数组的操作。 - **文件和流操作**:学习如何读写文件,使用内存流和磁盘流进行数据交换。 - **异常处理**:通过实例了解如何抛出...

    C# 3.0 锐利体验系列课程(2):Lambda表达式.pdf

    ### C# 3.0 锐利体验系列课程(2):Lambda表达式 #### Lambda表达式概述 在C# 3.0中,Lambda表达式作为一种强大的语法特性被引入,它极大地简化了代码编写过程,并提高了代码的可读性和维护性。Lambda表达式能够以...

Global site tag (gtag.js) - Google Analytics