2

XNAの物理ライブラリのドキュメントを閲覧していて、誰かが車のクラスを作成するために使用した例に気づきました。

これは非常に単純な例です。

Class Car
{
   private float gravity;
   private float maxSpeed;

   public Car(float gravity, float maxSpeed)
   {
        this.gravity = gravity;
        this.maxSpeed = maxSpeed;
   }
}

コンストラクターを作成し、渡されたパラメーターの割り当てを設定したら、次のようにします。

Class Car
{
  private float _gravity;
  private float _maxSpeed;

  public Car(float gravity, float maxSpeed)
  {
       _gravity = gravity;
       _maxSpeed = maxSpeed;
  }
}

どちらのアプローチにも利点はありますか?私はこれに数回しか遭遇していませんが、そうすることには正当な理由があると思います。いわば「ベストプラクティス」の方法を探しているだけです。

ありがとう!

4

6 に答える 6

4

両方の例は機能的に同一であり、両方の方法は異なる人々によって使用されています。どの命名規則を採用するかはあなた次第です。フィールドにパラメータと同じ名前を付ける場合は、を使用thisしてアクセスする必要があります。

重要なことは、名前の一貫性を保つことです。私は個人的にキーワードでフィールドにアクセスすることを好みますがthis、アンダースコアのアプローチを好む人は間違いなくこのあたりにたくさんいます。

アンダースコア:

プライベートフィールドの前にアンダースコアを付ける場合は、参照する場所で常にアンダースコアを使用する必要があります。それを見るだけで、それが私的な分野であることは明らかです(あなたが慣習を知っているならば)。残念ながら、それも非常に醜いですが、それは私の意見です。

アンダースコアなし:

プライベートフィールドの前にアンダースコアを付けない場合は、直接参照するか、キーワードを使用して参照するかを選択できます。thisこれは、忘れることができることを意味し、あなたの例では、引数をそれ自体に割り当てることができますgravity = gravity;。ただし、これは少なくとも警告を生成するはずです。StyleCopツールを使用する場合、デフォルトでは、キーワードを介して常にプライベートフィールドにアクセスするように強制されます。this

その他の回答については、次の同様の質問を参照してください。

于 2010-08-15T00:02:32.293 に答える
3

自動プロパティの出現により、これもかなり人気が高まっています...

public class Car
{
  public Car(float gravity, float speed)
  {
    Gravity = gravity;
    Speed = speed;
  }

  protected float Gravity { get; private set; }
  ...

私は個人的にこのアプローチを好みますが、自動プロパティを読み取り専用としてマークすることはできません。

于 2010-08-15T00:06:46.323 に答える
2

どちらも一般的なアプローチであり、どちらも完全に問題ありません。

個人的には、アンダースコアが醜いので、最初の方が好きです。しかし、多くの人は、変数がローカル変数ではなくクラスのメンバーであることを識別するのに役立つため、アンダースコアを付けることを好みます。

于 2010-08-14T23:59:45.643 に答える
1

どちらでも構いません。個人的には、this.特に自動プロパティの出現によるアプローチを好みます。例:public string Something {get; set;}。コンストラクターの引数名をプロパティ名と同じままにしておくと、コードを呼び出すユーザーに、値がどこに到達するかを非常に明確に示すことができます。

于 2010-08-15T00:07:35.783 に答える
1

Resharperに出くわした場合、デフォルトの規則のいくつかを次に示します。

  • グローバル変数はアンダースコアで宣言されます。

    string _variable1;

  • 定数であるグローバル変数は、上部のキャメルケースで宣言する必要があります。

    const string Variable1;

  • プロパティは常に上部のキャメルケースにある必要があります。

    文字列Variable1{get;set;}

私はアンダースコアのファンではないかもしれませんが、アンダースコアがスコープの識別にどのように役立つかはわかります。

于 2010-08-15T00:26:36.593 に答える
0

「これ」が解決に役立つ読みやすさの問題がいくつかあります。私は、誰かのコードを読んで、それがどのように機能するか、またはそれからどのように派生するかを理解する多くの状況にあります。複雑な相互に関連するクラスの束を読んで、あなたは次のようなものを見つけます

var foo =_FatNumber;

したがって、_FatNumberの検索を開始し、定義されているものを見つけることができません。それは基本クラスにあるからです。base.Fatnumberというラベルが付いている場合は、ここを気にしないでください。this.SlimNumberは非常に明示的です。誰が変数を宣言するか(通常は変数のコントローラー)に明示的にラベルを付けることをお勧めします。これは、より複雑な派生クラスの問題にすぎないかもしれませんが、クラスの動作を理解するために多くの時間を節約できたはずです。

例えば:

public class FooBase
{
    protected int Foo { get; set; }
}

public class FooDerived : FooBase
{
    int Bar = 9;

    public int GetTheThing(bool something)
    {
        if (somthing)
            return this.Bar;
        else
            return base.Foo;
    }
}
于 2010-08-15T01:03:56.757 に答える