1. ホーム
  2. c#

[解決済み] C#のenumとマッチングプロパティの命名規則

2023-01-18 16:17:40

質問

私はよく、ある種の独自のステータスプロパティをenumとして保持しているクラスを実装していることに気づきます。私は、Status 列挙型と Status 型の ONE Status プロパティを持っています。この名前の衝突はどのように解決すればよいでしょうか。

public class Car
{
  public enum Status
  {
    Off,
    Starting,
    Moving
  };

  Status status = Status.Off;

  public Status Status // <===== Won't compile =====
  {
    get { return status; }
    set { status = value; DoSomething(); }
  }
}

もし Status 列挙型が異なる型に共通であれば、クラスの外に置いて問題は解決するでしょう。しかし、StatusはCarにしか適用されないので、クラスの外で列挙を宣言するのは意味がありません。

この場合、どのような命名規則を使用するのでしょうか?

注意: この質問は、以下の回答に対するコメントで部分的に議論されました。 この質問 . でなかったので メイン の質問ではなかったので、あまり注目されませんでした。

編集: Filip Ekberg は、'Status' の特定のケースのための IMO 素晴らしい回避策を提案しています。しかし、enum/property の名前が異なる場合、Michael Prewecki の 回答 .

EDIT2 (2010年5月)。私のお気に入りの解決策は、Chris S が提案したように、enum 型名を複数形にすることです。MS のガイドラインによると、これはフラグ enum にのみ使用されるべきです。しかし、私はこの方法がますます好きになりました。私は今、通常の列挙型にもこれを使用しています。

どのように解決するのですか?

私の1ユーロをこの議論に加えますが、おそらく何も新しいことは追加されないでしょう。

明白な解決策は、Status をネストされた Enum から移動することです。ほとんどの .NET 列挙型は (Windows.Forms 名前空間の一部を除いて) 入れ子になっておらず、API を消費する開発者にとって、クラス名をプレフィックスとして使用しなければならず、煩わしいものです。

言及されていない 1 つのこと は、MSDN のガイドラインによると、フラグ列挙型は は複数形の名詞である というもので、おそらくすでにご存じでしょう (Status は単純な列挙型なので、単数形の名詞を使用すべきです)。

State(Statesという列挙型)はvocative、quot;Status"は名詞のnominativeで、英語は他の言語と同じくラテン語から吸収したものです。Vocativeは名詞の状態を表すもので、nominativeは動詞の主語です。

ということは、言い換えれば、車が が動いているとき という動詞があり、movingがその状態です。しかし、車が発進するのではなく、エンジンが発進するのです。また、エンジンがかかるのでもありません(あなたはここで例を選んだのでしょうから、これは関係ないかもしれません)。

public class Car
{
  VehicleState _vehicleState= VehicleState.Stationary;

  public VehicleState VehicleState 
  {
    get { return _vehicleState; }
    set { _vehicleState = value; DoSomething(); }
  }
}

public enum VehicleState
{
    Stationary, Idle, Moving
}

Stateは一般名詞なので、どのような状態を指しているのかを記述した方が良いのではないでしょうか?私が上でやったように

タイプの例も、私の見解では、リーダーのタイプに言及しているのではなく、そのデータベースに言及しています。私は、リーダーのデータベース製品を説明しているのであれば、それが望ましいと思いますが、それは必ずしもリーダーのタイプに関連しているわけではありません (たとえば、リーダーのタイプはフォワードのみ、キャッシュなどかもしれません)。そこで

reader.Database = Databases.Oracle;

実際には、enumを使う代わりにドライバと継承チェーンとして実装されているため、このようなことは起こりません。