WPF Singleton ValueConverters性能影响

时间:2013-12-23 06:37:22

标签: .net wpf xaml singleton valueconverter

我一直在WPF中使用Singleton值转换器。但是最近我和一位同事发生了争执,他说使用值转换器的单例实例是不好的,因为它们只会被app域卸载。他建议单例转换器只有在页面保持加载直到应用程序卸载时才会派上用场。真的想在这里了解WPF专家的观点。

编辑(带示例): 我有一个像

这样的转换器
public class ABCConverter : IMultiValueConverter
{
    private static ABCConverter _instance;

    public static ABCConverter Instance
    {
        get { return _instance ?? (_instance = new ABCConverter()); }
    }

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return true;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return false;
    }
}

我目前在xaml中使用它

Converter="{x:Static conv:ABCConverter.Instance}"

提前致谢。

拉​​吉

3 个答案:

答案 0 :(得分:1)

你在这里争论的是微观优化。除非您的值转换器非常庞大,否则它所消耗的内存将非常小。

不要过早优化。值转换器的“标准”模式是在每个绑定中创建一个新实例,即避免单例。如果您发现自己遇到内存问题,请在此时进行优化。使用分析工具确定问题的位置并专门针对它们。我愿意打赌你的价值转换器不会成为内存问题的根本原因。

答案 1 :(得分:0)

我的观点是,建议将值转换器设置为Singleton,因为转换器可能没有任何本地值,只是将值转换为所需的值。

答案 2 :(得分:0)

对此没有明确的答案,这取决于您的具体情况。如果您正在使用适当的依赖注入框架(即Ninject,Unity等),那么您可以在单例范围内创建对象而无需实际创建单例,您甚至可以将转换器的范围限定为特定对象的生命周期,例如:父窗口。您可能想要研究的另一件事是弱引用,您可以获得单例的性能优势,但如果应用需要更多内存,它们会在例行GC期间定期清理。