newslot属性的目的是什么?

时间:2019-04-05 09:41:56

标签: c# clr cil

我正在通过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节),将虚拟方法引入到继承层次结构中。的   可以将定义标记为newslot以始终为定义类和任何其他类创建新的虚拟方法   从中派生的类:

     

1)如果定义标记为newslot,则定义将始终创建一个新的虚拟   方法,即使基类提供了匹配的虚方法。对的参考   通过包含方法定义的类或通过派生的类来实现虚拟方法   从该类中引用新定义(除非被隐藏在新闻稿定义中   派生类)。不通过包含以下内容的类对虚拟方法的任何引用   方法定义,也未通过其派生类引用原始定义。

     

2)如果定义未标记为newslot,则定义将创建一个新的虚拟方法   仅当没有从名称继承的具有相同名称和签名的虚拟方法时   基类。

     

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

短语“定义创建新的虚拟方法”是什么意思?我以为虚拟方法的引入总会创造出新方法。我认为新闻通讯是无用的属性。有人可以提供示例来澄清该文本吗?

1 个答案:

答案 0 :(得分:2)

您是否熟悉C#中方法定义中的new modifier? -同样的概念。

您说的是“此方法与我的基类现在或将来公开的任何方法都不相同”。即使我们使用了完全相同的名称。人们通过我的基类的变量调用方法X或在我的继承链的更远处从我的基类获取方法X。人们在类或从其派生的类的变量上调用方法X会得到 this 方法X(除非派生类引入了自己的newslot X方法)

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

  

如果该定义未标记为newslot,则仅当没有从基类继承的具有相同名称和签名的虚拟方法时,该定义才会创建新的虚拟方法

在IL级别,您可以将替代标记为virtual,而在C#中则不能。这就是newslot是重要的区别功能的原因。