【问题标题】:Why Delegate and MulticastDelegate classes are not considered as base class?为什么 Delegate 和 MulticastDelegate 类不被视为基类?
【发布时间】:2019-01-07 15:03:43
【问题描述】:

当我继承 Delegate 或 MulticastDelegate 类时,我遇到编译器错误,这两个都是普通的抽象类,即使我无法继承这些类。

您能告诉我为什么这些类不被视为基类吗?

【问题讨论】:

标签: c# inheritance delegates


【解决方案1】:

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

这不是可以继承的特征,您可以为不可变的基类派生一个类并使其可变。并且违反了不变性要求。

因此,编译器对此有一个严格的规则,并拒绝您自己从 MulticastDelegate 派生的尝试。它保留权利,坚持它只能自己正确完成,您必须使用 delegate 关键字。并且做得更多,它会自动为 Invoke() 和 BeginInvoke() 方法创建正确的声明,这些声明强制您以类型安全的方式使用这些方法。

这不会减慢您的速度。

【讨论】:

    【解决方案2】:

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

    MSDN Says:

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

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 2017-08-15
      • 1970-01-01
      • 2016-04-25
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多