2011-09-08 87 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