什么是叫委托,委托的意义和作用

本文深入浅出地介绍了委托的概念及其在编程中的重要作用。通过实际案例,解析了委托如何帮助开发者解决代码设计者与使用者之间的需求差异问题,并展示了委托在简化代码、提高灵活性方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



Public Class Class1


    '什么是叫委托,委托的意义和作用。

    '委托概念的产生原因是因为分别出现了代码的设计者和使用者的关系。

    '因为这种设计者与使用者的关系的原因,就出现了代码的设计者一系列预定义问题。

    '代码的设计者设计阶段有一个面临实现关键核心功能具体化问题,主要是代码的设计者并不知道代码的使用者具体要求什么样的功能。

    '因为,代码的设计者来说代码的使用者需要的功能可能是几百种甚至几千种都可能!!!

    '这就是代码的设计者设计阶段面临的最头疼的问题。

    '微软长期挖苦中突然闪亮了一对双眼金睛,从那双眼金睛中使劲儿拉出来了委托字样和模式。


    '大家请继续保持精神!因为,本大魔王正在破旧的餐桌上演讲呢


    '委托的第一的作用;

    '举一个Task任务类型的对象来说明问题吧!

    'Task对象是由微软设计出来的,美利坚合众国微软是代码的设计者。

    'Task对象创建过程中分为可预知的部分和不可预知的部分组成。

    '代码的设计者在设计阶段可预知的部分是由代码的设计者自己预定义完成相关功能,例如;Start,Wait,Result等等众多可预知功能。

    '但是,代码的设计者不可预知的部分是什么呢???

    '因为,Task对象是属于线程操作类型的。但是代码的设计者并不知道代码的使用者在此Task上具体需要实现什么样的功能,

    '这就是代码的设计者设计阶段面临的得了感冒一般头疼的问题。


    '上面已经提到,美国微软已经发明了<委托>。现在已经是派上用场的时候了!!!

    '代码的设计者在设计阶段不可预知的部分直接委托给代码的使用者,使代码的使用者自己定义实现具体功能。

    '同时,代码的设计者并不需要关心代码的使用者具体需要什么样的功能了。

    '如果,没有委托那怎样了? 其结果是每个用户的使用者可能需要的功能上达几百种甚至几千种更是天文数字啊!!!

    '这样的状态下代码的设计者永远无法做到满足,代码的使用者也无法使用如此繁多的功能列表上查找使用!

    '有了委托就解决了如上的所有难题。



    '委托的第二作用;

    '本大魔王举一个最简单的小学一年级加减乘除+-*/来讲课。


    Private Function MyFunc1(ByVal Math1 As Integer) As Integer
        Const Val1 As Integer = 20
        Return Val1 + Math1
    End Function
    Private Function MyFunc2(ByVal Math1 As Integer) As Integer
        Const Val1 As Integer = 20
        Return Val1 - Math1
    End Function
    Private Function MyFunc3(ByVal Math1 As Integer) As Integer
        Const Val1 As Integer = 20
        Return Val1 * Math1
    End Function
    Private Function MyFunc4(ByVal Math1 As Integer) As Integer
        Const Val1 As Integer = 20
        Return Val1 / Math1
    End Function

    '请看上面定义的四个函数,实现加减乘除功能使用了四个函数。

    '如果,在公共函数中代码的设计者如此这样模式设计,vb.net的函数列表中能看到无法承受的庞大的函数纵队!!!

    '估计本大魔王也用不了!




    '这时候委托该派上用场了!!!


    '请看下面代码的设计者设计的一个函数。

    '这个函数使用了委托,代码的使用者凭借这样设计的唯一一个函数,都能自定义实现加减乘除4个功能!!!


    Private Function MyFunc(ByVal Math1 As Integer, ByVal Func1 As Func(Of Integer, Integer, Integer)) As Integer
        Const Val1 As Integer = 20
        Return Func1.Invoke(Val1, Math1)
    End Function




    '代码的使用者使用过程中自定义实现功能。
    '具体如下;

    Sub MySub()
        Dim Result1 As Integer
        '代码的使用者自定义实现加法功能;
        Result1 = MyFunc(5, Function(a As Integer, b As Integer) a + b)
        '代码的使用者自定义实现减法功能;
        Result1 = MyFunc(5, Function(a As Integer, b As Integer) a - b)
        '代码的使用者自定义实现乘法功能;
        Result1 = MyFunc(5, Function(a As Integer, b As Integer) a * b)
        '代码的使用者自定义实现除法功能;
        Result1 = MyFunc(5, Function(a As Integer, b As Integer) a / b)
    End Sub


    '委托的第三作用;

    '这个大家自己寻找答案吧! 免费已经足够了!!!


    '本大魔王继续演讲委托的类型问题。


    '委托本身具有委托类型,代码的设计者通过声明委托,然后使用者实例化实现自定义功能。

    '委托类型是lambda表达式类型的。所以,只能用Sub,Function这2种类型的。

    '使用环境不同出现了2种类型的实例化委托方式,就是lambda表达式和AddressOf这2种类型来实例化委托。

    '其中AddressOf关键字只用来引用带名称的Sub或Function时使用。lambda表达式则直接在委托上实例化。


    '所以,本大魔王的结论是委托实质是Sub或Function的抽象。代码的设计者不可预知的部分委托给使用者,而且代码的设计者只是做了Sub或Function的抽象。

    '代码的使用者使用阶段具体化Sub或Function,代码的使用者由此梦想成真自定义实现具体功能。


    '我的小魔王出来鼓掌一下,激发本大魔王威力无比的智慧!

    '最后强调本大魔王是一个大家认识的高丽棒子!


    '网上忽悠概念的人实在是太多。

    '有人说委托是安全类型的指针函数,又有人说委托是委托给别人结果带回来等等让人苦笑不得的局面层出不穷。

    '
   

   
End Class

### 关于匿名委托的定义用法 #### 定义 在 C# 中,匿名委托是一种无需显式命名的方法表达形式。它可以用于简化代码结构,在某些场景下替代传统的命名方法[^1]。匿名委托通过 `delegate` 关键字直接定义方法体,而不需要单独编写一个命名方法。 #### 语法格式 匿名委托的基本语法如下所示: ```csharp delegate([参数列表]) { [代码块] } ``` 其中 `[参数列表]` 是传递给匿名方法的参数,`[代码块]` 则是实际执行的操作逻辑。 --- #### 用法示例 ##### 示例 1:基本匿名委托 下面是一个简单的例子,展示如何使用匿名委托来实现功能: ```csharp using System; namespace DelegateExample { delegate void NumberChanger(int n); class Program { static void Main(string[] args) { // 创建匿名委托实例 NumberChanger nc = delegate (int x) { Console.WriteLine("Anonymous Method: {0}", x); }; // 调用匿名委托 nc(10); // 输出 Anonymous Method: 10 } } } ``` 在这个例子中,匿名委托被用来打印传入的整数值[^3]。 --- ##### 示例 2:结合现有委托类型 如果已经存在一个委托类型,则可以直接将其与匿名委托关联起来: ```csharp using System; class TestDelegate { public delegate void DisplayMessage(string message); static void Main() { // 使用匿名委托初始化 DisplayMessage 类型的变量 DisplayMessage display = delegate (string msg) { Console.WriteLine($"Received Message: {msg}"); }; // 调用匿名委托 display("Hello from anonymous method!"); // 输出 Received Message: Hello from anonymous method! } } ``` 此代码片段展示了如何利用现有的委托类型并为其分配匿名方法[^4]。 --- ##### 示例 3:多播委托中的匿名委托 匿名委托也可以参与构建多播委托链表,从而允许一次性触发多个操作: ```csharp public delegate void Action(); class MultiCastDemo { static void Main() { Action actionChain = null; // 添加第一个匿名委托 actionChain += delegate () { Console.WriteLine("First Anonymous Action"); }; // 继续添加其他动作... actionChain += () => Console.WriteLine("Second Lambda Expression"); // 执行整个链条上的所有行为 actionChain(); } } // 输出结果将是两行文字分别对应上面两个不同的处理方式。 ``` 这里不仅有传统意义上的匿名委托还有现代更简洁写法即 lambda 表达式的混合运用[^4]。 --- ### 总结 匿名委托提供了一种灵活的方式来快速定义小型、特定用途的功能模块而不必正式声明它们的名字。尽管如此,在项目开发过程中还是应该权衡利弊合理选用这种技术手段以免造成可读性维护性的下降。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值