C# 坚持创建对象

C# 坚持创建对象,c#,oop,class,object,constructor,C#,Oop,Class,Object,Constructor,是否有过这样一种情况,即保存创建对象所需的数据并仅在绝对必要时创建它比保存对象本身更好/更有效 一个简单的例子: class Bar { public string Data { get; set; } } class Foo { Bar bar; readonly string barData; public Foo(string barData) { this.barData = barData; } public

是否有过这样一种情况,即保存创建对象所需的数据并仅在绝对必要时创建它比保存对象本身更好/更有效

一个简单的例子:

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; } }
}
一般来说,没有(如果我理解你的问题是正确的)

就性能而言,分配/构造成本较低。除非你在做一些疯狂的事情,否则在设计中感觉自然的时候构造你的对象-不要过早地优化。

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


就性能而言,分配/构造成本较低。除非你正在做一些疯狂的事情,否则在设计中感觉自然的时候构造你的对象——不要过早地优化。

如果对象在构造中执行一些复杂的操作,例如分配系统资源,这是有意义的


您必须帮助延迟对象的实例化。除此之外,如果您需要,它还内置了线程安全性。

如果对象在构造时执行一些复杂的操作,例如分配系统资源,那么它是有意义的


您必须帮助延迟对象的实例化。除此之外,如果您需要,它还内置了线程安全功能。

如果创建对象意味着填充它,那么是的,要填充它,您需要执行一个缓慢的操作

比如说,

List<int> ll = returnDataFromDBVeryVerySlowly();
List ll=returnDatafromDbVeryVeryVerySlowley();

Lazy ll=new Lazy(()=>
{
从DbVeryVeryVery()返回返回数据;
});

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

如果创建对象意味着填充它,则需要执行一个缓慢的操作

比如说,

List<int> ll = returnDataFromDBVeryVerySlowly();
List ll=returnDatafromDbVeryVeryVerySlowley();

Lazy ll=new Lazy(()=>
{
从DbVeryVeryVery()返回返回数据;
});

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

在运行时之前不会创建任何内容。:)在运行时之前,不会创建任何内容。:)+1对于懒惰者,这在这种情况下绝对有意义+1对于懒惰者,这在这种情况下绝对有意义。不要在构造函数中做太多的工作。重新设计具有havy构造函数的类要好得多。下面的链接是谷歌对此的推荐。很好的解释@gmamaladze-不确定“重型构造师”与我的问题有何关联。这个问题更多的是关于延迟加载,而不是如何创建灵活的构造函数。。。事实上,您会注意到Foo构造函数遵循link.Agree中概述的原则。不要在构造函数中做太多的工作。重新设计具有havy构造函数的类要好得多。下面的链接是谷歌对此的推荐。很好的解释@gmamaladze-不确定“重型构造师”与我的问题有何关联。这个问题更多的是关于延迟加载,而不是如何创建灵活的构造函数。。。事实上,您会注意到Foo构造函数遵循链接中概述的原则。