类成员实例化

时间:2014-11-05 13:41:14

标签: c# .net

public class ClassA
{
    private SomeOtherClass _someOtherClass = new SomeOtherClass();     
}

public class ClassB
{
    private SomeOtherClass _someOtherClass;

    public ClassB()
    {
         _someOtherClass = new SomeOtherClass();
    }
}

public ClassC
{
    SomeOtherClass _someOtherClass
    public SomeOtherClass someOtherClass
    {
        get{
            if(_someOtherClass == null)
            {
                _someOtherClass = new SomeOtherClass();
            }
            return _someOtherClass;
        }
    }
}

以上所有内容都完成了使用对象实例填充属性。其中一个对其他人有好处吗?实际上,当我无法控制类的构造时(例如在GUI中),我只使用C.我闻到了一点味道,但我没有具体的气味。

注意我从讨论中省略了控制反转(IOC)模式,因为它的好处是众所周知的,我当然经常使用它。这个问题更多的是关于一个可能不需要这种模式的简单类的情况。

3 个答案:

答案 0 :(得分:3)

A和B几乎相同(订单上的实施细节,但在这种情况下并不重要)。

我会在以下时间使用C:

  • 变量的初始化可以延迟,或者不经常使用;
  • 我想优化类的初始化时间和内存。

C的另一个选择是使用Lazy<T>,但这超出了我认为的问题范围。

答案 1 :(得分:0)

嗯,第一个和第二个例子的工作方式相同,但我可以说第二个例子比第一个更干净,因为实例化在构造函数中,构造函数的目的通常是初始化对象的可以在那一刻定义的成员。通过这种方式,您可以通过查看构造函数轻松了解已实例化的内容,而不是搜索所有字段。在前两种情况中的任何一种情况下,如果您在此之后未更改其值,则可以将该字段标记为readonly

我认为第三个是一种延迟加载,因为当你获得属性时你将初始化该字段。当我不确定是否将在类中使用该对象时,我使用它,因此它是根据请求创建的。但是,如果实例化该字段,则每次检查的开销最小,但使用当前硬件无需担心。如果您仅在类中使用该对象,则可以将该属性标记为private,因为它没有理由从外部看到。

答案 2 :(得分:0)

A和B(如在其他答案中所述)基本相同。构造类时将填充该属性。

C不会在构造类时填充该属性,但仅在访问它时才会填充该属性,这可能由于多种原因(例如性能)而有用。此外,它还具有副作用,即属性永远不能为“空”(无论何时访问它,这可能是一个优点或缺点,取决于属性的用途。