我一直在WPF中使用单例值转换器。但是最近我和一位同事发生了争执,他说使用值转换器的单例实例是不好的,因为它们只会由应用程序域卸载来处置。他建议单例转换器只有在页面保持加载直到应用程序卸载的情况下才会派上用场。真的很想知道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}"
提前谢谢。
拉吉
你在这里争论的是微优化。除非你的值转换器非常大,否则它消耗的内存将非常小。
不要过早优化。值转换器的"标准"模式是在每个绑定中创建一个新实例,即避免单例。如果您发现自己遇到内存问题,请在此时进行优化。使用分析工具确定问题所在并专门针对它们。我敢打赌,您的值转换器不会是内存问题的根本原因。
我的观点是,建议将值转换器作为单例,因为转换器可能没有任何本地值,它只是将值转换为所需的值。
这个问题没有明确的答案,这取决于你的具体情况。如果您使用的是适当的依赖注入框架(即 Ninject、Unity 等),那么您可以在单例范围内创建一个对象,而无需实际创建单例,您甚至可以将转换器的范围限定为特定对象的生命周期,例如父窗口。您可能想要研究的另一件事是弱引用,您可以获得单例的性能优势,但如果应用程序需要更多内存,则会在例行 GC 期间定期清理它们。