私は時々このように書かれたコードを見たことがあります:
public class B1
{
}
public class B2
{
private B1 b1;
public B1 B1
{
get { return b1; }
set { b1 = value; }
}
}
つまり、クラスB2には「B1」という名前のプロパティがあり、これも「B1」タイプです。
私の直感はこれは良い考えではないと私に言っていますが、プロパティにそのクラスと同じ名前を付けることを避けるべきである技術的な理由はありますか?
(問題がある場合は、.net 2.0を使用しています)。
大丈夫だよ。ここでの標準的な例は
public Background {
public Color Color { get; set; }
}
ここで発生するまれな問題(コーナーケース)がありますが、このデバイスを回避するのに十分ではありません。率直に言って、このデバイスは非常に便利だと思います。私は次のことができないことを楽しんでいないでしょう:
class Ticker { ... }
public StockQuote {
public Ticker Ticker { get; set; }
}
言いたくないTicker StockTicker
またはTicker ThisTicker
など.
プロパティにそのタイプと同じ名前を付けることを検討してください。
列挙に強く型付けされているプロパティがある場合、プロパティの名前は列挙の名前と同じにすることができます。たとえば、
CacheLevel
という名前の列挙がある場合、その値の1つを返すプロパティの名前もCacheLevel
にすることができます。
列挙型またはプロパティ一般にこれを推奨しているだけなのかどうかは、少し曖昧です。
欠点は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プロパティと重複するため、フォームイベントは完全な名前空間を使用して静的メンバーにアクセスする必要があります。
ちょうど今日、エリックは「カラーカラー」問題についてブログに書きました。
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
個人的にはなるべく避けます。
別の落とし穴は、内部型です。
私はいつもこれに遭遇します:
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;
}
}
特に問題はありません。読みにくくするか、読みやすくする場合があります。実際、一部のMicrosoftライブラリにはこれらの種類のプロパティがあります(具体的には、enum
プロパティを使用すると、これは通常意味があります)。
この共通パターンは、クラス内のインスタンスメンバーを参照するときに常にthis
を使用する理由の1つです。例えば常に
this.SomeMethod(this.SomeProperty);
そして決して
SomeMethod(SomeProperty);
ほとんどの場合、実際のあいまいさはありませんが、物事を明確にするのに役立ちます。さらに、プロパティ/メソッドが定義されている場所がわかります。
プロパティの名前とタイプが同じ場合は、少し混乱する可能性がありますが、それ以外はそれほど問題ではありません。
名前に意味がある場合は、通常、名前とタイプを同じにすることをお勧めします。より適切な名前を考えることができる場合は、もちろんそれを使用する必要がありますが、この状況を回避するためだけに、名前を作成しようとしないでください。
大文字と小文字を除いて、タイプと同じ名前を付けています。私のメソッドとプロパティは「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
はクラスの名前です。