可能重复:
Difference between TargetType=“controlType” and TargetType=“{x:Type controlType}”
when to use {x:Type …}?
在Difference between TargetType="controlType" and TargetType="{x:Type controlType}"我可以看到这些不同的设置类型的方法基本相同。但我想知道是否有任何性能影响,因为我猜{x:Type}将实例化一个标记对象。
答案 0 :(得分:2)
我建议创建一个更少的对象将有利于性能。但是,在这种情况下,性能增益可能会很小,以至于您最好考虑代码的可读性。
我总是使用{x:Type someType}
,因为它清楚地表明这是我正在讨论的类型。
当我稍后改变时,我总是可以搜索{x:Type
。
答案 1 :(得分:2)
在这里谈论表现是缺少树木的树林。
如果使用string
值,WPF将使用值转换器将其转换为Type
对象;否则它将使用标记扩展名。在两个案例中,一个天真的实现会创建一个额外的对象。因此,我不知道如何假设这两种情况中的任何一种产生的对象少于另一种情况。
很可能(需要检查MS源确认).NET缓存并重用这些类的单例实例,因为它们已知是无状态的。
因此,我认为在这种情况下,性能考虑完全不合适。我的观点是,使用{x:Type}
会更好,因为从XAML中可以清楚地看出产生了什么样的价值。
答案 2 :(得分:0)
正如Jon指出的那样,在两种情况下都使用“转换器”来返回基于字符串的Type。
使用x:Type
时,它实际上使用TypeExtension。如果你在Reflector中查看这段代码,你可以看到它基本上是这样的:
IXamlTypeResolver service = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
return service.Resolve(<<"typenamehere">>);
当您只是传递一个字符串值(即您不使用x:Type
)时,则使用类型转换器。在这种情况下,由于目标属性是Type,因此使用的转换器是TypeTypeConverter。
如果查看TypeTypeConverter的ConvertFrom方法,您将看到它执行与TypeExtension相同的操作。
因此,Type转换代码的字符串是相同的。所以唯一的区别在于TypeExtension与TypeTypeConverter的实例化。
在任何一种情况下都会根据需要创建一个新实例,但是框架更有可能重用TypeTypeConverter。这也可能是未来的优化,但可能不太可能。
无论哪种方式,我怀疑你是否注意到使用一种方法或另一种方法可以改善任何性能。
答案 3 :(得分:0)
值得注意的是,在将类型名称提供为字符串的情况下,不使用TypeConverter和MarkupExtension。
根据MSDN -
键入支持Typename-as-String的属性
WPF支持允许指定某些值的技术 类型Type的属性,不需要x:Type标记扩展名 用法。相反,您可以将值指定为命名的字符串 类型。这方面的例子是ControlTemplate.TargetType和 Style.TargetType。 不提供对此行为的支持 无论是类型转换器还是标记扩展。相反,这是一个 通过FrameworkElementFactory实现的延迟行为。