web-dev-qa-db-ja.com

プロパティはそのタイプと同じ名前を持つ必要がありますか?

私は時々このように書かれたコードを見たことがあります:

public class B1
{
}

public class B2
{
    private B1 b1;

    public B1 B1
    {
        get { return b1; }
        set { b1 = value; }
    }
}

つまり、クラスB2には「B1」という名前のプロパティがあり、これも「B1」タイプです。

私の直感はこれは良い考えではないと私に言っていますが、プロパティにそのクラスと同じ名前を付けることを避けるべきである技術的な理由はありますか?

(問題がある場合は、.net 2.0を使用しています)。

65
Moe Sisko

大丈夫だよ。ここでの標準的な例は

public Background {
    public Color Color { get; set; }
}

ここで発生するまれな問題(コーナーケース)がありますが、このデバイスを回避するのに十分ではありません。率直に言って、このデバイスは非常に便利だと思います。私は次のことができないことを楽しんでいないでしょう:

class Ticker { ... }


public StockQuote {
    public Ticker Ticker { get; set; }
}

言いたくないTicker StockTickerまたはTicker ThisTickerなど.

61
jason

メンバーのMicrosoftネーミングガイドライン 状態:

プロパティにそのタイプと同じ名前を付けることを検討してください。

列挙に強く型付けされているプロパティがある場合、プロパティの名前は列挙の名前と同じにすることができます。たとえば、CacheLevelという名前の列挙がある場合、その値の1つを返すプロパティの名前もCacheLevelにすることができます。

列挙型またはプロパティ一般にこれを推奨しているだけなのかどうかは、少し曖昧です。

16
Dan Diplo

欠点は1つしか考えられません。このようなことをしたい場合:

public class B1
{
        public static void MyFunc(){ ; }
}

public class B2
{
        private B1 b1;

        public B1 B1
        {
                get { return b1; }
                set { b1 = value; }
        }

        public void Foo(){
                B1.MyFunc();
        }
}

代わりに以下を使用する必要があります。

MyNamespace.B1.MyFunc();

これの良い例は、Winformsプログラミングでの一般的な使用法です。System.Windows.Forms.CursorクラスはSystem.Windows.Forms.Form.Cursorプロパティと重複するため、フォームイベントは完全な名前空間を使用して静的メンバーにアクセスする必要があります。

11
MiffTheFox

ちょうど今日、エリックは「カラーカラー」問題についてブログに書きました。

http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx

個人的にはなるべく避けます。

9
SolutionYogi

別の落とし穴は、内部型です。

私はいつもこれに遭遇します:

public class Car {
    public enum Make {
        Chevy,
        Ford
    };

    // No good, need to pull Make out of the class or create
    // a name that isn't exactly what you want
    public Make Make {
        get; set;
    }
}
3
Chris

特に問題はありません。読みにくくするか、読みやすくする場合があります。実際、一部のMicrosoftライブラリにはこれらの種類のプロパティがあります(具体的には、enumプロパティを使用すると、これは通常意味があります)。

3
Mehrdad Afshari

この共通パターンは、クラス内のインスタンスメンバーを参照するときに常にthisを使用する理由の1つです。例えば常に

this.SomeMethod(this.SomeProperty);

そして決して

SomeMethod(SomeProperty);

ほとんどの場合、実際のあいまいさはありませんが、物事を明確にするのに役立ちます。さらに、プロパティ/メソッドが定義されている場所がわかります。

1
Annabelle

プロパティの名前とタイプが同じ場合は、少し混乱する可能性がありますが、それ以外はそれほど問題ではありません。

名前に意味がある場合は、通常、名前とタイプを同じにすることをお勧めします。より適切な名前を考えることができる場合は、もちろんそれを使用する必要がありますが、この状況を回避するためだけに、名前を作成しようとしないでください。

1
Guffa

大文字と小文字を除いて、タイプと同じ名前を付けています。私のメソッドとプロパティは「lowerCase」です。したがって、MiffTheFoxのような問題はありません。

public class B1
{
    public static void myFunc(){ ; }
}

public class B2
{
    private B1 m_b1;

    public B1 b1
    {
        get { return m_b1; }
        set { m_b1 = value; }
    }

    public void Foo()
    {
        B1.myFunc(); //this is Ok, no need to use namespace
    }
}

だから私にとっては、m_b1はメンバーデータ、b1はプロパティ(またはローカル変数またはパラメーター)であり、B1はクラスの名前です。

0
ChrisW