2011-10-14 99 views
1

是否曾经有过这样一种情况:持有必要的数据来创建一个对象,并且在绝对必要时仅创建它,比保持对象本身更好/更有效?坚持创建对象

一个小示例:

class Bar 
{ 
    public string Data { get; set; } 
} 

class Foo 
{ 
    Bar bar; 
    readonly string barData; 

    public Foo(string barData) 
    { 
     this.barData = barData; 
    } 

    public void MaybeCreate(bool create) 
    { 
     if (create) 
     { 
      bar = new Bar { Data = barData }; 
     } 
    } 

    public Bar Bar { get { return bar; } } 
} 
+3

直到运行时才创建任何内容。 :) –

+0

@Ilia -question编辑。 – Didaxis

回答

3

如果对象在施工上执行一些复杂的操作(例如分配系统资源),这是有意义的。您有Lazy<T>可以帮助您延迟对象的实例化。除此之外,如果您需要它,它内置了线程安全。

+0

+1对于懒惰,在这种情况下确实有意义 – Didaxis

3

一般来说,没有。 (如果我理解你的问题是正确的)。

分配/结构在性能方面很便宜。除非你在做一些疯狂的事情,否则当设计感觉自然时就构建你的对象 - 不要过早优化。

+0

是的,你理解正确。谢谢 – Didaxis

+0

同意。不要在构造函数中做太多工作。重新设计一个具有庸俗指导者的课程会好得多。以下链接是谷歌对此的重视。非常好的解释。 http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/ –

+0

@gmamaladze - 不确定“重构造函数”与我的问题有何关系。这个问题更多的是关于延迟加载,而不是如何创建灵活的构造函数......实际上,您会注意到Foo构造函数遵循链接中概述的原则。 – Didaxis

1

是的,如果创建对象意味着填充它,并填充它,你需要做一个缓慢的操作。

例如,

List<int> ll = returnDataFromDBVeryVerySlowly(); 

Lazy<List<int>> ll = new Lazy<List<int>>(() => 
{ 
    return returnDataFromDBVeryVerySlowly(); 
}); 

在第一个例子returnDataFromDBVeryVerySlowly将始终调用,即使你不需要它。在第二种情况下,只有在必要时才会被调用。这是很常见的,例如,在ASP.NET中,您希望“准备好”许多“标准”数据集,但是除非需要这些数据集,否则您不希望它们被填充,并且希望将它们作为您的成员页面,以便多种方法可以访问它们(另一种方法可以直接调用returnDataFromDBVeryVerySlowly

+0

+1 – Didaxis