2012-07-16 13 views
0

我班有複雜的屬性:.NET延遲加載/預先計算的性能

private Image m_LogoImage=null; 

    public Image LogoImage 
    { 
     get 
     { 
      if (m_LogoImage == null && File.Exists(Data.LogoFileUrl)) 
      { 
       DrawingImage image = DrawingImage.FromFile(Data.LogoFileUrl); 
       m_LogoImage = Image.GetInstance(image, new Color(1, 1, 1)); 
      } 
      return m_LogoImage; 
     } 
    } 

LogoImage.get很慢,而且消耗資源的行動,在第一時間將客戶端調用它,屬性計算圖像和將結果存儲在私有變量m_LogoImage中。
這對我來說很基本。 .NET支持自動屬性(public string P {get;set;})。它是否支持自動存儲複雜的屬性?

回答

5

有很多基於狀態的問題,所以沒有語言級別的延遲加載機制。

然而,您可以使用Lazy<T>類來完成此功能。

private Lazy<Image> logo = new Lazy(() => LoadImage()); 

public Image LogoImage 
    { 
     get 
     { 
      return logo.Value; 
     } 
    } 

您也可以使用空合併運算符(??)爲可空類型做延遲加載。

get 
{ 
    return image ?? (image = LoadImage()); 
} 
0

否 - 它不支持「自動存儲複雜屬性」 - 因爲這意味着它必須支持「自動加載複雜屬性」 - 這必須可以自定義......然後您最終以C#結束。

0

從它的樣子:DrawingImage.FromFile(Data.LogoFileUrl);您的數據來自某種靜態對象。每個基於類實例的加載的當前方法是在每個新實例中一次又一次加載相同的對象。您可以在初始運行時通過將數據預加載到靜態對象中進行優化。例如:

private static Image _m_LogoImage = DrawingImage.FromFile(Data.LogoFileUrl); 

public Image LogoImage 
{ 
    get { return _m_LogoImage; } 
} 
+1

1.數據可能只是一個實例成員。 2. FileUrl在靜態類初始化時可能不可用。 – Asti 2012-07-16 22:43:39

+1

^^^正確。不知道細節,這只是一個靜態的建議。 – loopedcode 2012-07-16 22:56:50