🧱委托 (Delegate)vs 函数指针:
将委托理解为函数指针,但有区别
| 特性 | C++ 函数指针 | C# 委托 |
|---|---|---|
| 类型安全 | ❌ 不完全 | ✅ 完全类型安全 |
| 支持多个方法(多播,将多个方法绑定在一个委托上,在被调用时会逐个实现) | ❌ 需要手动实现 | ✅ 支持(+/-)操作 |
| 可以引用实例方法 | ❌ 需要绑定对象 | ✅ 支持 |
| 异步调用 | ❌ | ✅ 支持(BeginInvoke) |
🧱C# 中常见的内置委托类型
C# 提供了一些常用委托类型,省去了自己定义 delegate 的麻烦:
| 类型 | 等价于 C++ 的 | 说明 |
|---|---|---|
Action | std::function<void()> | 没有返回值,无参数 |
Action<T> | std::function<void(T)> | 无返回值,带一个参数 |
Func<T, TResult> | std::function<TResult(T)> | 有返回值 |
Predicate<T> | std::function<bool(T)> | 返回 bool 的判断函数 |
🧱实际应用:事件(Event)
这是 C# 委托最常用的场景之一。
C++ 中的事件机制(槽函数绑定)
connect(button, &QPushButton::clicked, this, &MyClass::handleClick);
C# 中的事件机制(基于委托)
button.Click += HandleClick;
private void HandleClick(object sender, EventArgs e)
{
MessageBox.Show("Button clicked!");
}
✅ C# 的委托 = C++ 的函数指针 + std::function + lambda 的结合体,并且更安全、更强大、更易用。
262

被折叠的 条评论
为什么被折叠?



