关于使用更少代码但得到相同结果的懒惰实例化?当然,这通常是一件好事(提供简短/高效的代码不会损害可读性/可维护性)。
请参阅这个懒惰的实例:
public sealed class Singleton
{
private Singleton()
{
}
public static Singleton Instance { get { return Nested.instance; } }
private class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
没有Instance
的私有属性(我知道它是隐含的) - 它是否使它变得懒惰 - 事实上我们在public static Singleton Instance
属性中没有setter?
答案 0 :(得分:13)
假设我们有一个构造成本昂贵的领域
class Foo
{
public readonly Expensive expensive = new Expensive();
...
}
此代码的问题在于,Foo
的实施会导致实现Expensive
的性能成本 - 无论是否访问Expensive
字段。显而易见的答案是按需构建实例或 lazily instansiate 该字段:
class Foo
{
Expensive _expensive;
public Expensive
{
get
{
if (_expensive == null) _expensive = new Expensive();
return _expensive;
}
}
...
}
这是懒惰的实施。
答案 1 :(得分:6)
延迟初始化是一种做法,您只需在第一次需要时加载或初始化对象 。
潜在地,这可以为您带来巨大的性能提升,特别是如果您的应用程序中有大量组件。
请查看Wikipedia页面以获得更深入的了解(以编码示例为特色)。
答案 2 :(得分:5)
不,懒惰的实例化意味着在实际需要它之前,不会花费任何时间和资源创建一些东西。
在你的单例示例中,instance
只是一个空引用,直到实际使用它为止。当它被使用时,然后你花费资源用new
实例化对象。
答案 3 :(得分:2)
这是懒惰的,因为类Singleton
的实例直到您第一次提出时才会创建。
答案 4 :(得分:2)
对象的延迟初始化意味着它的创建将延迟到首次使用为止。
有关完整参考,请参阅msdn post Lazy Initialization
在上面的代码中,在调用它之前不会创建单例类的实例。 因此,在调用代码之前,您的程序不会使用资源。