3

我一直在 WPF 中使用 Singleton 值转换器。但最近我和一位同事发生了争执,他说使用 valueconverters 的单例实例是不好的,因为它们只能由应用程序域卸载处理。他建议单例转换器仅在页面保持加载直到应用程序卸载的情况下才会派上用场。真的很想在这里了解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}"

提前致谢。

拉吉

4

3 回答 3

2

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

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

于 2013-12-23T06:47:10.687 回答
0

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

于 2013-12-23T06:49:48.583 回答
0

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

于 2013-12-23T06:51:36.957 回答