为什么 MarkupExtension 是 wpf 中的类

joo*_*zek 5 c# wpf xaml markup-extensions

MarkupExtension 类的反编译如下所示:

[TypeForwardedFrom("WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
public abstract class MarkupExtension
{
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    protected MarkupExtension()
    {
    }

    public abstract object ProvideValue(IServiceProvider serviceProvider);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它本来可以作为接口实现,但它是一个类。WPF 团队为什么要这样设计?而且,在Silverlight中它是一个接口

Yas*_*adi 0

在 .NET 中,您有 NGEN(本机生成器),它允许您将 IL 代码编译为适合运行应用程序的特定机器的机器代码。(你不能使用这个工具将你的IL代码编译为所有计算机的机器代码,这个工具依赖于CPU,操作系统和......]。你的应用程序的性能将因为这个工具而得到很大的提升。

WPF(.NET)版本代码中使用的属性[TargetedPatchingOptOut]是针对NGEN工具的,并且该属性在这里是在构造函数之上使用的,因此该接口不适合这里。

在 Silverlight 中,您没有 NGEN,也没有名为 [TargetedPatchingOptOut] 的属性

祝你好运

  • [MSDN:System.Runtime.TargetedPatchingOptOutAttribute 类](http://msdn.microsoft.com/en-us/library/system.runtime.targetedpatchingoptoutattribute.aspx),[StackOverflow:TargetedPatchingOptOut:“跨 NGen 图像边界内联的性能至关重要” ”?](http://stackoverflow.com/q/6109745/293099)。内联空方法就是删除对它的调用。另请参阅[.NET Framework 4 中 NGen 的改进](http://blogs.msdn.com/b/clrcode Generation/archive/2009/05/03/improvements-to-ngen-in-.net-framework-4。 ASPX) (3认同)