Конвертер лучшая практика для лучшей производительности - PullRequest
0 голосов
/ 08 сентября 2011

Я использую конвертер 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 ]

4 голосов
/ 08 сентября 2011

Наиболее эффективным было бы использовать 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;
}

См. Этот ответ для хорошего обсуждения: Метод можно сделать статическим, но должен ли он?

3 голосов
/ 08 сентября 2011

Хотя с точки зрения производительности единственной важной вещью является не выполнять преобразование в каждом вызове 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 для значение, на которое оно должно измениться. )

1 голос
/ 08 сентября 2011

Второй вариант, но используйте поля static readonly, если эти цвета всегда постоянны. Таким образом, вы выполняете работу один раз, а не каждый раз, когда создаете конвертер.

...