方法名加括号 vs 不加括号的区别。

A.eventAnimal += dog.DogCall("汪汪汪");

💣 为什么会报错?(原理解析)

还记得我们之前用"烤蛋糕说明书"做的比喻吗?

  • dog.DogCall(不加括号):代表的是"说明书本身"(方法的内存地址)。

  • dog.DogCall("汪汪汪")(加了括号,还传了参数):这是在对 CPU 下达指令:"现在、立刻、马上给我执行这个方法!"

因为 dog.DogCall 的返回值是 void(什么都没有),所以当你写下 A.eventAnimal += dog.DogCall("汪汪汪"); 时,编译器看到的是:你立刻执行了狗叫,然后试图把一个"虚无(void)"赋值给事件。 事件需要的是"一份说明书"(方法的地址),而不是方法执行后的结果!

🛠️ 正确的写法是什么?

事件绑定的核心法则是:只传方法名(不带括号,不带参数)

正确写法 1:标准的事件订阅

C#

复制代码
Animal A = new Animal();
Dog dog = new Dog();

// ✅ 正确绑定:只给说明书本身,不要加括号!
A.eventAnimal += dog.DogCall; 

🤔 疑问来了:如果不写 ("汪汪汪"),参数从哪里来?

这是事件机制最核心的逻辑:参数是由"发布者(触发事件的人)"给的,而不是由"订阅者(绑定事件的人)"给的!

我们来看看你的代码串起来后,正确的数据流向是怎样的:

C#

复制代码
Animal A = new Animal();
Dog dog = new Dog();
Cat cat = new Cat();

// 1. 订阅事件(发说明书给 Animal)
A.eventAnimal += dog.DogCall;
A.eventAnimal += cat.CatCall;

// 2. 准备参数(由发布者 Animal 准备好数据)
A.Name = "旺财和小黑"; // 这里准备了参数!

// 3. 发布事件!
// 当执行这句时,底层就会拿着 "旺财和小黑" 这个字符串,
// 挨个去调用 dog.DogCall("旺财和小黑") 和 cat.CatCall("旺财和小黑")
A.showEvent(); 

💡 进阶:如果我非要在绑定的地方,强行传自定义参数怎么办?

如果你非要让它叫 "汪汪汪",完全不理会 Animal 传过来的 Name,这时候就要用到我们刚学的 Lambda 表达式了,你可以把它包在一层"匿名方法"里:

C#

复制代码
// 利用 Lambda 表达式包装一层
// 意思是:当收到 Animal 传来的 name 时,我不理它,我自己强制执行 dog.DogCall("汪汪汪")
A.eventAnimal += (name) => dog.DogCall("汪汪汪");
相关推荐
雪隐1 天前
WPF + MVVM 实战系列02-告别 INPC 手写时代,做个体面的现代 WPF 人
前端·后端·c#
我是苏苏1 天前
WPF开发01:基础控件及常用模板篇
开发语言·c#·html·wpf
BerrySen1781 天前
现代 C# 全栈与高性能编程实战指南:从 CLR 底层机制到 AI Agent 智能体架构
人工智能·架构·c#
在世修行1 天前
从零打造 C# 工业视觉检测系统(六):OpenCV 图像处理与像素级比例尺标定
opencv·c#·视觉检测
小金子会发光1 天前
C# WinForms 手搓 Modbus RTU 调试助手:不依赖第三方 Modbus 库,从 CRC16 到 8 种功能码完整实现
c#·modbusrtu·串口通讯
上海安当技术2 天前
C/S 桌面软件怎么接 UKey 强认证?C# SDK 与 C 动态库集成 WinForms/Qt/工控实战
c语言·qt·c#
明如正午2 天前
【C#】跨线程更新进度条_UpdateProgress 方法解析
c#
曹牧2 天前
C#:`JsonConvert.DeserializeObject`
windows·c#
望天hous2 天前
C#中masstranist快速入门
开发语言·c#
冷咖啡离 我的笨笨2 天前
数据去重:通过 C# 删除 Excel 中的重复行
开发语言·c#·excel