2014-01-27 63 views
0

我有這樣的片段多個屬性碼一類的大量:如何實現延遲加載的屬性

IFoo a; 
public IFoo Foo 
{ 
    get 
    { 
     if (a == null) 
     { 
      // load a 
      ... 
     } 
     return a; 
    } 
} 


IBar b; 
public IBar Bar 
{ 
    get 
    { 
     if (b == null) 
     { 
      // load b 
      ... 
     } 
     return b; 
    } 
} 

我有超過20 Propertys,那裏總是界面是不同的,不是裝-結構體。 我覺得這段代碼不是最優的。

有沒有更好的解決方案?也許一些通用的,如(不工作):

T b; 
public T Bar<T> 
{ 
    get 
    { 
     if (b == null) 
     { 
      // load b 
      ... 
     } 
     return b; 
    } 
} 
+0

當調用屬性getter時,是否有加載的原因,而不是實例化? –

+2

@JonB它被稱爲延遲加載。 – Servy

+0

我認爲這並不能解決我的問題。我有這些解決方案的多個代碼,即例如20個屬性= 20個代碼片段。 – boqus

回答

1

嘗試使用Lazy<T>結構這實際上是你的代碼的語法糖。從MSDN

例(在構造函數中定義如何延遲加載的對象AA Func鍵,線程安全的):

lazyLargeObject = new Lazy<LargeObject>(() => 
{ 
    LargeObject large = new LargeObject(Thread.CurrentThread.ManagedThreadId); 
    // Perform additional initialization here. 
    return large; 
}); 

則該值將在第一次嘗試訪問該對象這樣取:

LargeObject large = lazyLargeObject.Value; 
+4

不只是說出來,解釋它是如何做到的 –

1

你在找什麼是Lazy Loading Pattern的實現。

有一些常見的方法來完成它,如:虛擬代理,價值持有人和幽靈。 正如@bjeger所提到的,您可以使用Lazy < T>來解決您的問題,但仔細觀察並研究上述實現會讓您知道哪些更適合您的特定情況。

以下是使用C#的一些示例:Four Ways to Implement Lazy Loading in C#

0

使用LazyInitializer.EnsureInitialized

using System.Threading; 

IFoo a; 
public IFoo Foo 
{ 
    get 
    { 
     return LazyInitializer.EnsureInitialized(ref a,() => { /* load a */ }); 
    } 
} 
0

一種方式來獲得更短的性能至少是懶惰<牛逼>:

Lazy<IBar> b = new Lazy<IBar>(); 
public IBar Bar 
{ 
    get 
    { 
    return b.Value; 
    } 
} 

當b.Value首次調用它會調用伊巴爾的默認constructo 。有多個重載必須處理線程安全並調用其他構造函數。請參閱:http://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx