转换最佳实践以获得更好的性能

时间:2011-09-08 12:20:29

标签: wpf performance converter

我正在使用WPF转换器并且在性能方面想知道在下面的示例中使用类成员或局部变量会更好吗?

    public object Convert(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture)
    {
        if ((int)value == 1)
            return (Color)ColorConverter.ConvertFromString("#FCD44E");

        return (Color)ColorConverter.ConvertFromString("#FCD44E");
    }

或:

    Color _color1 = (Color)ColorConverter.ConvertFromString("#FCD44E");
    Color _color2 = (Color)ColorConverter.ConvertFromString("#FCD666");

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((int)value == 1)
            return _color1;

        return _color2;
    }

3 个答案:

答案 0 :(得分:4)

最高效的是使用private static readonly,如下所示

private static readonly Color Color1 = (Color)ColorConverter.ConvertFromString("#FCD44E");
private static readonly Color Color2 = (Color)ColorConverter.ConvertFromString("#FCD666");

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    if ((int)value == 1)
        return Color1;

    return Color2;
}

请参阅此答案以获得良好的讨论:Method can be made static, but should it?

答案 1 :(得分:3)

虽然在性能方面,唯一相关的事情是在每次调用Convert - 方法时都不进行转换(正如在其他答案中明确说明的那样),我永远不会写出这样的硬编码转换器首先,如果您可以参数化,请不要犹豫,例如:

public class OnValueToColorConverter : IValueConverter
{
    public int Value { get; set; }
    public Color OnValueColor { get; set; }
    public Color OffValueColor { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (int)value == Value ? OnValueColor : OffValueColor;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}
<vc:OnValueToColorConverter Value="1"
                            OnValueColor="#FCD44E" 
                            OffValueColor="#FCD666" />

对于这类事情,人们通常不会使用转换器,而是Style使用默认设置器和DataTrigger作为应更改的值。< / em>的)

答案 2 :(得分:1)

第二个选项,但如果这些颜色始终不变,请使用static readonly个字段。这样你就可以完成一次工作,而不是每次都创建一个转换器。