0

C#ではどちらがより一般的ですか?

class Foo
{
  private string _first;
  private string _second;

  public Foo(string first)
  {
    _first = first;
    _second = string.Empty;
  }
}

また

class Foo
{
  private string _first;
  private string _second = string.Empty;

  public Foo(string first)
  {
    _first = first;
  }
}
4

9 に答える 9

2

慣例についてはわかりませんが、より安全な方法は、2番目の例のようにメンバーを初期化することです。複数のコンストラクターがあり、そのうちの1つでinitを実行するのを忘れている場合があります。

于 2009-07-20T07:17:53.420 に答える
2

技術的には、基本クラスのコンストラクターから仮想関数を呼び出すときのスニペット間の動作にはわずかな違いがありますが、構築中に仮想関数を呼び出すことはとにかく悪い習慣なので、無視しましょう。

私は2番目が好きです。コンストラクターをオーバーロードしている場合は、コピー/貼り付けをいくらか節約でき、代入ステートメントを書くことを覚えておく必要はありません。コンパイラーがすべてを処理します。

割り当てられた値の計算が複雑すぎるか、フィールド初期化子に割り当てることができない場合は、保護された(またはプライベートな)デフォルトコンストラクターがあります

class Foo
{
    private Foo() { _second = SomeComplexCalculation(); }
    public Foo(string first) : this()
    {
       _first = first;
    }
}

代入の順序が重要な場合は、プライベート関数に初期化を実行させます。

于 2009-07-20T07:25:53.623 に答える
0

私は2番目の方法が好きです。より自然に見えます。

于 2009-07-20T07:16:01.973 に答える
0

プリミティブ型(String、intなど)には2番目の方法を選択します。

複雑なタイプの場合、私はコンストラクター内の初期化を好みます。

于 2009-07-20T07:19:28.677 に答える
0

2番目の方法には、いくつかの利点があります。まず、読みやすく、2番目に、よりDRYです。複数のコンストラクターがある場合、手動でそれらをチェーンしたり、初期化を複製したりする必要はありません。これにより、3番目の利点が得られます。エラーが発生しにくい。

于 2009-07-20T07:22:07.860 に答える
0

私は通常、コンストラクターでコンストラクターパラメーターとして渡された値を使用して変数の初期化を行い(もちろん)、デフォルトの初期化は、メンバー変数の定義のポイントで対応する値を直接割り当てることによって行います(2番目のソリューションで行ったように)

private string _second = string.Empty;

プロパティと一緒に私は次のような構造を持っています:

 public class Foo
 {

    public Foo(...)
    {
      ...
    }

    private string _Second = string.Emtpy;
    public string Second
    {
      get
      {
        return _Second;
      }
      set
      {
        _Second = value;
      }
    }

 }
于 2009-07-20T07:30:44.753 に答える
0

2番目の例は、コンストラクターを調べる時間を節約し、すべてのフィールドが(開発者の観点から)単一の場所で初期化されるため、一般的に推奨される方法です。

ただし、この2番目のスタイルを使用する場合、C#コンパイラは、クラス内に存在するすべてのコンストラクターの各フィールドに同じ初期化値を生成します。

于 2009-07-20T07:34:45.760 に答える
0

デフォルトのキーワードを使用しています。

// local variable
var x = default(Action);

// member variable
this.FieldX = default(Action);

更新:msdnへのリンクを追加しました

于 2009-07-20T07:50:36.477 に答える
0

Microsoftのベストプラクティスは、メンバーを宣言するときにメンバーを初期化することです。それで:

class Foo
{
  private string _first;
  private string _second = string.Empty;

  public Foo(string first)
  {
    _first = first;
  }
}

ここで答えになります。

また、メンバーをデフォルト値で初期化しないように指示します。

于 2009-07-20T08:06:03.013 に答える