【问题标题】:What is the purpose of newslot attribute?newslot 属性的用途是什么?
【发布时间】:2019-08-27 04:29:59
【问题描述】:

我正在通过 Common Language Infrastructure 书籍学习中间语言。 它指出虚拟类型的方法可以用newslot 属性标记。但是那个属性真的让我很困惑,我无法理解它的含义。

这里是引用:

II.10.3 - 引入和覆盖虚拟方法

通过提供方法的直接实现来覆盖基类型的虚方法 (使用方法定义,请参阅 §II.15.4)并且未将其指定为新闻栏(§II.15.4.2.3)。一个现有的 方法体也可用于使用 .override 指令实现给定的虚拟声明 (§II.10.3.2)。

II.10.3.1 引入虚方法

通过定义虚拟方法(§II.15.4)在继承层次结构中引入虚拟方法。这 可以将定义标记为新闻栏以始终为定义类和任何创建新的虚拟方法 从它派生的类:

1) 如果定义被标记为newslot,定义总是创建一个新的虚拟 方法,即使基类提供了匹配的虚拟方法。一个参考 虚拟方法通过包含方法定义的类,或通过派生的类 从该类中,指的是新定义(除非在 派生类)。任何不通过包含 方法定义,也不通过其派生类,引用原始定义。

2) 如果定义没有标记newslot,则定义创建一个新的虚方法 仅当不存在从 a 继承的同名和签名的虚拟方法时 基类。

因此,当一个虚方法被标记为newslot时,它的引入不会影响任何现有的 在其基类中引用匹配的虚拟方法。

“定义创建一个新的虚方法”这句话是什么意思?我认为引入虚拟方法总是会创建新方法。我认为新闻频道是无用的属性。任何人都可以提供示例来澄清该文本吗?

【问题讨论】:

    标签: c# clr cil


    【解决方案1】:

    你熟悉 C# 方法定义中的new modifier 吗? - 相同的概念。

    您是说“此方法与我的基类现在或将来公开的任何方法相同”。即使我们使用了完全相同的名称。人们通过我的基类的变量调用方法 X,或者进一步从我的基类获取方法 X。人们对我的类的变量或从它派生的类调用方法 X 会得到 this 方法 X(除非派生类引入自己的 newslot X 方法)

    这里的关键是,在 IL 级别,如果可覆盖的方法可用,则假定默认为覆盖:

    如果定义没有标记为newslot,则定义创建一个新的虚拟方法只有在没有从基类继承的同名和签名的虚拟方法时

    在 IL 级别,您可以将覆盖标记为 virtual,而在 C# 中则不能。这就是为什么newslot 是重要的区别特征。

    【讨论】:

    • 你能提供代码示例吗?对我来说还是太难理解了。至于我,虚拟方法的“新修饰符”没有意义
    • @LmTinyToon - 这是因为 C# 语言规则与 IL 规则不同。在 IL 中,覆盖是默认的,覆盖可以标记为虚拟等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2014-02-01
    相关资源
    最近更新 更多