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)模式,因为它的好处是众所周知的,我当然经常使用它。这个问题更多的是关于一个可能不需要这种模式的简单类的情况。
答案 0 :(得分:3)
A和B几乎相同(订单上的实施细节,但在这种情况下并不重要)。
我会在以下时间使用C:
C的另一个选择是使用Lazy<T>
,但这超出了我认为的问题范围。
答案 1 :(得分:0)
嗯,第一个和第二个例子的工作方式相同,但我可以说第二个例子比第一个更干净,因为实例化在构造函数中,构造函数的目的通常是初始化对象的可以在那一刻定义的成员。通过这种方式,您可以通过查看构造函数轻松了解已实例化的内容,而不是搜索所有字段。在前两种情况中的任何一种情况下,如果您在此之后未更改其值,则可以将该字段标记为readonly
。
我认为第三个是一种延迟加载,因为当你获得属性时你将初始化该字段。当我不确定是否将在类中使用该对象时,我使用它,因此它是根据请求创建的。但是,如果实例化该字段,则每次检查的开销最小,但使用当前硬件无需担心。如果您仅在类中使用该对象,则可以将该属性标记为private
,因为它没有理由从外部看到。
答案 2 :(得分:0)
A和B(如在其他答案中所述)基本相同。构造类时将填充该属性。
C不会在构造类时填充该属性,但仅在访问它时才会填充该属性,这可能由于多种原因(例如性能)而有用。此外,它还具有副作用,即属性永远不能为“空”(无论何时访问它,这可能是一个优点或缺点,取决于属性的用途。