【问题标题】:Performance diff between Target="someType" and Target="{x:Type someType}" [duplicate]Target="someType" 和 Target="{x:Type someType}" 之间的性能差异 [重复]
【发布时间】:2011-07-23 21:32:41
【问题描述】:

可能重复:
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} 将实例化一个标记对象。

【问题讨论】:

  • 我认为您问题中的链接问题可能已经回答了这个问题。您在这里遇到性能问题吗?或者,如果您只需要澄清其他问题的答案,您可以在其他问题的答案的评论中提出要求。

标签: .net wpf performance xaml targettype


【解决方案1】:

值得注意的是,TypeConverter 和 MarkupExtension 都不用于以字符串形式提供类型名称。

根据 MSDN -

支持 Typename-as-String 的类型属性

WPF 支持能够指定某些值的技术 Type 类型的属性,无需 x:Type 标记扩展 用法。相反,您可以将值指定为命名 类型。这方面的例子是 ControlTemplate.TargetType 和 样式.目标类型。 不通过以下方式提供对此行为的支持 类型转换器或标记扩展。相反,这是一个 通过 FrameworkElementFactory 实现的延迟行为

http://msdn.microsoft.com/en-us/library/ms753322.aspx

【讨论】:

    【解决方案2】:

    正如 Jon 所指出的,在这两种情况下,“转换器”都用于根据字符串返回类型。

    当使用x:Type 时,实际上是在使用TypeExtension。如果你在 Reflector 中查看这段代码,你会发现它基本上是这样的:

    IXamlTypeResolver service = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
    return service.Resolve(<<"typenamehere">>);
    

    当您只是传递一个字符串值(即您不使用x:Type)时,就会使用类型转换器。在这种情况下,由于目标属性是 Type,所以使用的转换器是 TypeTypeConverter。

    如果您查看 TypeTypeConverter 的 ConvertFrom 方法,您会发现它执行与 TypeExtension 相同的操作。

    因此,字符串到类型转换代码是相同的。因此,唯一的区别在于 TypeExtension 与 TypeTypeConverter 的实例化。

    无论哪种情况,都会根据需要创建一个新实例,但框架更有可能重用 TypeTypeConverter。这也可能是未来的优化,但可能不太可能。

    无论哪种方式,我怀疑你会注意到使用一种方法或另一种方法的任何形式的性能改进。

    【讨论】:

      【解决方案3】:

      在这里谈论性能是为了树木而错过森林。

      如果您使用string 值,WPF 将使用值转换器将其转换为Type 对象;否则它将使用标记扩展。在 both 情况下,一个简单的实现会创建一个额外的对象。因此,我看不出如何假设这两种情况中的任何一种创建的对象都比另一种少。

      很有可能(需要检查 MS 源来确认).NET 缓存和重用这些类的单例实例,因为它们已知是无状态的。

      因此,我认为在这种情况下,性能考虑完全不合适。我的意见是最好使用{x:Type},因为从 XAML 中就可以清楚地知道产生了什么样的值。

      【讨论】:

        【解决方案4】:

        我建议少创建一个对象将有利于性能。但是,在这种情况下,性能提升可能非常小,因此您最好考虑代码的可读性。

        我总是使用{x:Type someType},因为它清楚地表明这是我正在谈论的一种类型。

        当我稍后更改内容时,我总是可以搜索 {x:Type

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-29
          • 1970-01-01
          • 2021-08-18
          • 2023-01-10
          • 2022-01-03
          • 2020-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多