2011-09-08 80 views
0

我正在使用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; 
    } 

回答

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

第二个选项,但使用static readonly领域,如果这些颜色总是不变的。这样你就可以完成一次工作,而不是每次创建转换器。

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" /> 

对于这种人会不正常的方式使用转换器的事情,但有一个默认的setter一个Style和其所应改变值DataTrigger

+0

+1用于参数化。我根本不知道WPF,但我知道将颜色定义留给xml可能会更好。这可能比'private static readonly'字段的性能低。我可以想象这种差异不太可能被注意到。针对问题的最高性能解决方案并不总是最好的。不幸的是,这里需要反对ctor参数的属性。 – drstevens

+0

@drstevens:在大多数情况下,这将具有大致相同的性能,因为通常只创建一个转换器实例作为资源,然后引用无论哪个需要,因此这些值也只能解析一次(区别在于额外的int被解析)。事实上,这些属性并不是什么问题,因为转换器通常不能被代码访问,甚至在某些模式下不可访问,所以值不应该被改变(如果那是相反的话;可以采取一些措施来确保这一点当然,如果一个人是偏执狂) –

+0

:)有关财产的评论有些社论,我可能应该保留自己。在大量多线程环境中工作并查看其他语言中大量使用的模式后,我对C#中的属性产生了爱恨关系。它们是非常有用的,并且当不可变类型是可接受的并且更可取的时候,它们通常会使我们创建可变类型。我已经开始考虑使用物业而不是ctor params(除非绝对必要)来代码味道。 – drstevens