4

私はオブジェクト指向プログラミングの初心者ですが、簡単な質問が1つあります。違いは何ですか:

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

この場合、これら2つのクラスは同一です。実際、ほとんどすべての目的で、使用した2つのコードスタイルは同じです。一般に、ほとんどのスタイルガイドはフィールド初期化子の使用を推奨していることがわかります(これは静的フィールド初期化子に特に当てはまります)。

微妙な違いが1つありますが、それがあなたに影響を与える可能性はほとんどありません。

クラスメンバーをインラインで初期化するときはいつでも、C#は、コンストラクターでコードを実行する直前に、その初期化を実行するコードを生成します。特に、コンストラクターが基本クラスのコンストラクターを呼び出す場合。フィールド初期化子は基本クラスのコンストラクターが呼び出される前に実行されますが、ユーザー提供のコンストラクターのコードは後で実行する必要があります。つまり、次の2つのクラスは少し異なります。

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 に答える