为什么Delegate和MulticastDelegate类不被视为基类

本文关键字:基类 Delegate MulticastDelegate 为什么 | 更新日期: 2023-09-27 18:06:12

当我继承Delegate或MulticastDelegate类时,我得到编译器错误,两者都是正常的抽象类,即使我无法继承这些类。

你能告诉我为什么这些类不是基类吗?

为什么Delegate和MulticastDelegate类不被视为基类

因为MulticastDelegate的派生类的对象不可变是非常非常重要的。这样可以确保当您不知道的任意代码订阅事件处理程序时状态不会被破坏。. net中的不变性是通过约定实现的,你把字段设为私有,不提供属性设置,不提供默认构造函数。

这不是一个可以继承的trait,你可以为不可变基类派生一个类,并使它可变。并且违反了不变性要求。

所以编译器对它有一个硬性的规则,拒绝你自己从MulticastDelegate派生的尝试。它保留权利,坚持它只能自己做正确的事情,你必须使用delegate关键字。此外,它还自动为Invoke()和BeginInvoke()方法创建适当的声明,这些声明强制您以类型安全的方式使用这些方法。

因为它们是特殊的类,为CLR保留

MSDN说:

MulticastDelegate是一个特殊的类。编译器和其他工具可以从这个类派生,但不能显式地派生。的Delegate类也是如此。