2014-01-27 98 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