我是面向对象编程的初学者,我有一个简单的问题。有什么区别:
public class Calculation
{
private _externalObject = new ExternalClass();
public int FirstParameter {get;set;}
public int SecondParameter {get;set;}
public int ThirdParameter {get;set;}
public int FourthParameter
{
get
{
_externalObject.Calculate(FirstParameter, SecondParameter, ThirdParameter);
}
}
}
和
public class Calculation
{
private _externalObject;
public Calculation()
{
_externalObject = new ExternalClass();
}
public int FirstParameter {get;set;}
public int SecondParameter {get;set;}
public int ThirdParameter {get;set;}
public int FourthParameter
{
get
{
_externalObject.Calculate(FirstParameter, SecondParameter, ThirdParameter);
}
}
}
我想学习如何编写最佳代码。
答案 0 :(得分:7)
在这种特殊情况下,没有任何可衡量的差异。
但是,如果您有多个构造函数,则必须在每个构造函数中初始化该字段,如果您没有在字段声明中直接执行该操作。
这比个人风格更重要。
关于类设计和集成的注意事项 - 如果你有这样的外部依赖关系,那么好的OOP会要求你使用DI(依赖注入)而不是直接在类中实例化值。构造函数注入是一个不错的选择:
private ExternalClass _externalObject;
public Calculation(ExternalClass externalClass)
{
_externalObject = externalClass;
}
以上允许在不改变实际类的情况下修改行为,并使类更易于测试。
答案 1 :(得分:2)
在这种情况下,这两个类是相同的。事实上,对于几乎所有目的,您使用的两种代码样式是相同的。通常,您会发现大多数样式指南建议使用字段初始值设定项(静态字段初始化程序尤其如此)。
有一个微妙的区别,但它不太可能影响你。
每当你初始化内联类成员时,C#就会在运行构造函数中的任何代码之前生成执行初始化的代码。特别是,如果构造函数调用基类构造函数。在调用基类构造函数之前运行字段初始值设定项,而用户提供的构造函数中的代码必须在之后运行。也就是说,以下两个类略微不同:
public class B : A
{
// This happens *before* the base-class constructor.
public ExternalObject external = new ExternalObject();
public B () : base() { }
}
public class C : A
{
public ExternalObject external;
public C () : base()
{
// This happens *after* the base-class constructor.
this.external = new ExternalObject();
}
}
请注意,如果您没有提供默认构造函数,C#会自动为您提供一个调用base()
的构造函数,即使您没有,也会使您的类“看起来像”类B
显式提供B()
构造函数。
在实践中,差异不太重要。您实际上不能在字段初始值设定项中引用this
,因此您不能依赖于在任何一种情况下构造的基类。