由于TargetedPatchingOptOut等属性未在框架内处理,因此在优化期间属性是否会传播到继承的类?
例如:
public abstract class TestBase
{
[TargetedPatchingOptOut("Optimize across boundaries")]
public abstract void TestFunc();
}
public class Test : TestBase
{
// Is re-defining attributes like these necessary?
public override void TestFunc()
{
throw new NotImplementedException();
}
}
此外,JIT编译器(永远/永远)查找继承属性吗?
注意:虽然通过检查WinDbg上的JIT指令可以轻松找出上面的特定功能 (繁琐的)奢侈的方法,我很欣赏任何有关它的见解 实现,因为 JIT编译器不是不可能的行为 对于不同的属性,在不知道其确切性的情 实施
更新:
我做了一个错误的假设,即TargetedPatchingOptOut由JIT编译器处理,但它实际上是由NGen处理的。 @Hans Passant清楚地回答了这个具体案例的答案。
我认为可以安全地猜测,每个内部工具都使用与AttributeUsage标志相同的规则来使用属性。
答案 0 :(得分:3)
默认情况下属性在派生类上是否可见由AttributeUsageAttribute.Inherited属性确定。这个属性的 false :
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor,
AllowMultiple = false, Inherited = false)]
public sealed class TargetedPatchingOptOutAttribute : Attribute {
// etc...
}
它不是独占的,像Type.GetCustomAttribute()这样的方法也有一个 inherit 参数,允许覆盖默认值。
小心做出关于什么工具读取属性的假设。 [TargetedPatchingOptOut]几乎肯定是不被抖动读取。它用于确定在部署更新时Ngen.exe是否需要运行以重新创建程序集的本机映像。我不知道工具是什么样的,唯一对我有意义的是,这是在Redmond的Microsoft机器上完成的。