当前位置: 首页 > news >正文

委托

委托

delegate void Foo();

本质上是引用类型,需要被实例化,实例化时需要传入一个函数。

var foo = new Foo(Method);
foo += Method2;
foo -= Method;
//两种调用方法:
foo();
foo.Invoke();

委托可以为空(声明后减掉)。

回调函数

var callback = new Callback(MyCallback);HeavyJob(callback);void HeavyJob(Callback callback)
{Thread.Sleep(1500);callback.Invoke();
}void MyCallback() => "Job is done.".Dump();
var rule = new MyRule(ChooseBiggerInteger);
PickOne(5, 10, rule);void PickOne(int x, int y, MyRule rule)
{if(rule.Invoke(x, y)) x.Dump();else y.Dump();
}bool ChooseBiggerInteger(int x, int y) => x >= y ;delegate bool MyRule(int x, int y);

泛型

var add = new Add<int>(AddMethod);
Method( 5, 1000, add ).Dump();int Method( int x, int y, Add<int> add) => add.Invoke(x, y);int AddMethod(int x, int y) => x + y;delegate int Add<T>(T x, T y);

.Net提供的强类型委托:Action, Func

Action无返回值,Func有返回值

var myrule = new Func<int, double, bool>(MyRule);
PickOne(5, 6.5555, myrule).Dump();object PickOne(int x, double y, Func<int, double, bool> rule)
{if(rule(x, y)) return x;return y;
}bool MyRule(int x, double y) => x > y;

这个例子中返回值为bool,放入Func的第三个参数中表示,前两个表示T1、T2

匿名委托:把方法声明省略:

PickOne(5, 6.5555, delegate (int a, double b) {return a > b;}).Dump();object PickOne(int x, double y, Func<int, double, bool> rule)
{if(rule(x, y)) return x;return y;
}

lambda表达式

PickOne(5, 11.5555, ( a , b ) => a > b ).Dump();object PickOne(int x, double y, Func<int, double, bool> rule)
{if(rule(x, y)) return x;return y;
}

关于lambda表达式:

var f = (int a, int b) => a > b;   //Func
var f0 = (int a) => a++; //Func
var f1 = (int a) => {a++;} ; //Action 
//此处var是Action<int>类型,在C#10.0后引入委托类型的自动推测f.Dump();
f0.Dump();
f1.Dump();

事件

事件只可以+= 或 -= ,不能赋值,赋值的话就成委托字段了!!(真抽象)

var demo = new Demo();
demo.MyEvent += () => "hello".Dump();  
// 匿名lambda  等同于 delegate() { "hello".Dump(); }demo.InvokeEvent();class Demo
{public event Action MyEvent;public void InvokeEvent() => MyEvent?.Invoke();
}

常见场景:订阅类内部某种改变,用于观测

var demo = new Demo();
demo.CountChanged += (int x) => $"Count Changed to {x}".Dump();demo.Count++;
demo.Count++;
demo.Count++;class Demo
{int count;public int Count{get => count;set {count = value;CountChanged?.Invoke(count);}}public event Action<int> CountChanged;
}

标准.net事件模式

//ObservableCollection
//当集合发生变化时自动通知(添加、删除、清空、重置)
var collection = new ObservableCollection<int>();// sender: 触发事件的集合(就是 collection 本身)
// e: NotifyCollectionChangedEventArgs 类型,包含变更详情
// 比如,e.Action可能为NotifyCollectionChangedAction.Add
collection.CollectionChanged += (sender, e) => "collection changed observed".Dump(); 
//见EventHandler

EventHandler

public delegate void EventHandler(object sender, EventArgs e);// 参数说明:
// sender: 谁触发了这个事件?(事件的发送者)
// e: 事件的相关数据(比如变更的内容)
http://www.jsqmd.com/news/571090/

相关文章:

  • AI去背景神器完全指南:3分钟制作专业级透明GIF的终极秘籍
  • Graphormer开源可部署价值:满足GDPR/科研数据本地化合规要求
  • Netty ChannelPipeline 线程安全机制的深度解析
  • Claude Code:终端AI助手如何重塑开发者的编程工作流
  • 2026年枕头品牌综合实力盘点:深耕专业与沉淀的十大品牌 - 华Sir1
  • 大麦抢票工具终极指南:如何用自动化工具告别抢票失败
  • 保姆级教程:在Windows 10上搞定Xmind 2023的安装与激活(附资源)
  • 从GPU到NPU:Qwen3-Embedding模型昇腾适配与性能优化实战
  • LoRA训练助手GPU显存优化:Qwen3-32B INT4量化后仅需9.2GB显存稳定运行
  • 2026选转塔冲生产厂家,这几家别错过,PSH系列数控折弯机/CNC剪板机/电液同步折弯机/折弯机,转塔冲公司联系方式 - 品牌推荐师
  • Zynq UltraScale+ MPSoC PCIe Tandem配置实战:如何用两段Bit文件解决120ms启动难题
  • LongCat-Video:重构AI视频生成技术边界的开源突破
  • 横向评测:东莞地区主流 AI 培训企业实力对比
  • 弱口令漏洞挖掘全维度实战技巧(附通用弱口令 + 工具 + 系统默认密码汇总)
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---GUI-MCP 整体架构
  • 5步攻克Deep-Live-Cam实时换脸技术:从环境诊断到高级应用全指南
  • 2026年四川广告设计培训深度探索 电商培训与视觉培训优质机构甄选 - 深度智识库
  • 线程安全
  • 低代码开发:如何选择适合企业的开发平台
  • HsMod:炉石传说功能增强插件完全指南
  • 【学习】IP地址分类全解析
  • 红包变现实用指南:分期乐支付宝红包回收正规流程全解析 - 京回收小程序
  • 20-40mm普碳钢板材矫直机设计【11辊平行式】【说明书、CAD图纸、solidworks三维、开题报告、任务书】
  • 动态奖励机制:verl如何突破LLM强化学习的三大技术瓶颈
  • 电机控制 ODrive 工程宝藏分享:从代码到原理图,全方位解析
  • ide-eval-resetter解决JetBrains IDE试用期限制实战:2026开发者指南
  • 3步让暗黑破坏神2在现代PC上焕然一新:d2dx图形增强方案全解析
  • 适用发质护发素测评:4款产品对油性发质的真实效果 - 博客万
  • IDEA插件EasyCode实战:5分钟搞定SpringBoot+MyBatis代码生成(含Lombok配置)
  • 改善C#代码的一些方法