白话“委托的使用”
关于委托的使用,长期以来一直令人困惑。很多书籍上的解释,不是似是而非,就是只讲语法,难以令人信服。
委托形似方法。如果我们就委托来说方法,是一个永远也解不开的扣。
委托实例时,接受一个方法,来帮助我们处理事情。那为什么不直接使用方法呢?如同,我们叫大管家张三通知仆人李四去买醋,那为什么我们不直接通知仆人李四呢?
有人说,当有n个仆人时(n个方法)供我们选择时,这样代码清楚,效率高。但我想,只是这样的理由,那不足以发明委托这个对象。
个人认为:
如果我们告诉大管家需要买醋时,我们还没有雇到仆人,连大管家都不知道该找谁去买时,这个逻辑就成立了;也就是说,当我们定义委托时,它所接受的方法,根本就不存在,也没有地方去找。但是,代码还要编下去,并且,这个方法的实现有可能是非常复杂的,没有规律可循的。
举个例子:
public class 旅游
{
public delegate int 到北京的时间();
}
public interface I来自天津
{
int 天津();
}
public interface I来自海南
{
int 海南();
}
public interface I来自纽约
{
int 纽约();
}
public class 去北京:旅游,I来自天津,I来自海南,I来自纽约
{
int 天津()
{
汽车n小时;
}
int 海南()
{
汽车n小时 + 飞机n小时
}
int 纽约()
{
汽车n小时 + 轮船n小时 + 火车n小时
}
static void Main(string[] args)
{
到北京的时间 d = new 到北京的时间( "方法名" );
int s = d();
Console.WriteLine(s);
}
}
这是自己对委托这个对象的认知,用白话来给于诠释。但自己心中也没有实底,欢迎大家讨论!
抱歉!有朋友说上面代码看不懂,这是由于上面的代码只是逻辑说明,没有严格的推导,故重写一个可以运行的程序来说明:(大家可以试一试)
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
//--------------------------------------------------------------------------------------
public class 基类
{
public static string sName; // 声明字段
public delegate string 委托(); // 声明委托
public static string 你是谁( 委托 d ) // 定义方法,将委托作为参数
{
sName = d(); // 关键理解:获取委托的签名,相当于获取那个未知方法的签名!
return sName; // 返回参数
}
public static void 告诉你() // 定义方法
{
Console.WriteLine( sName ); // 显示
Console.Read();
}
}
// 注意:因为委托接受的方法没有定义,所以将委托做为一个方法的签名,可以使程序可以继续编下去。
//--------------------------------------------------------------------------------------
class 子类: 基类
{
public static string 仆人() // 在子类中定义,委托将要接受的方法
{
return "我叫李四,来自子类";
}
static void Main(string[] args)
{
委托 d = new 委托( 子类.仆人 ); // 实例委托
你是谁( d ); // 将委托传入方法
告诉你(); //
}
}
//--------------------------------------------------------------------------------------
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?