4

我是面向对象编程的初学者,我有一个简单的问题。有什么区别:

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);
          }
     }
} 

我想学习如何编写最佳代码。

4

2 回答 2

7

在这种特殊情况下,没有任何可测量的差异。

但是,如果您有多个构造函数,如果您没有直接在字段声明中进行初始化,则必须在每个构造函数中初始化该字段。

这更多的是个人风格问题。


关于类设计和集成的注意事项——如果你有这样的外部依赖,好的 OOP 会要求你使用 DI(依赖注入)而不是直接在类中实例化值。构造函数注入是一个不错的选择:

 private ExternalClass _externalObject;

 public Calculation(ExternalClass externalClass)
 {
       _externalObject = externalClass;
 }

以上允许在不更改实际类的情况下修改行为并使类更可测试。

于 2013-02-16T22:12:59.343 回答
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(),您的类也会“看起来像”类。BB()

在实践中,这种差异不太重要。您实际上不能this在字段初始值设定项中引用,因此在任何一种情况下都不能依赖正在构造的基类。

于 2013-02-16T22:26:05.660 回答