3

オブジェクトの列挙は、Java が C# より優れている数少ない機能の 1 つであることを知っています。

しかし、クラスが定数フィールドを使用してオブジェクトの列挙を表すために使用される場合がいくつか見られたので、int の代わりに「オブジェクトを返す」ことができます。

例として、Brushes クラスがあります。それは本当に列挙型のように機能します。

Brush b = Brushes.Blue;

主な違い (少なくとも私にとって) は、Brushes クラスから返された値を格納するために他のクラス (Brush クラス) が必要であることがわかります (暗黙的な演算子のオーバーロードを含む一部のコードはトリックを行うことができます)。

だから、私の質問は次のとおりです。良い習慣ですか?

これを自分のプロジェクトで使用してアニメーション (WPF) の列挙を作成し、作成した CustomControl で使用することを考えているためです。

ユーザーが必要とするウィッチ アニメーションを検出するには、スイッチ ケースをチェックする必要があるため、整数列挙を使用するよりも優れているように思えます。

4

2 に答える 2

5

列挙型は、Java と C# では根本的に異なるものです。C# では、それらは単なる整数型の名前ですが、Java では、名前付きの既定値を持つクラスによく似ています。C# では、一連の静的な読み取り専用フィールドまたはプロパティを持つクラスは、Java が列挙型と呼ぶものであり、switchそれらに対する機能はありません。

System.Drawing.Colorこのパターンはときどき現れます。System.Text.Encoding

ほとんどのものと同様に、乱用しない限り、それは良い習慣です。このパターンは通常、クラスまたは構造体に名前付きのデフォルトを提供するためにのみ使用されます。クラスが自立できること、およびこれらのプロパティの名前に大きく依存しないことを確認してください。時々何かをチェックする必要がある場合は、おそらく==演算子をオーバーロードすることで回避できます。

Java の列挙型とまったく同じものが必要な場合は、型を内部に格納する C# 列挙型を用意し、次の 2 つのいずれかを行う必要があります。

  1. すべてのコンストラクターが列挙型を要求するようにする
  2. 列挙型を内部的に設定する名前付きデフォルトを作成する

例:

public enum FooType
{
    A,
    B,
    C
}

public class Foo
{
    public FooType Type { get; private set; }

    // Option 1: forced via constructor

    public Foo(FooType type)
    {
        this.Type = type;
    }

    // Option 2: static properties
    // (using the constructor from option 1, can be done without it, though)

    public static Foo A { get { return new Foo(FooType.A); } }

    public static Foo B { get { return new Foo(FooType.B); } }

    public static Foo C { get { return new Foo(FooType.C); } }
}

使用法:

Foo bar = new Foo(FooType.B);

// OR

Foo bar = Foo.B;

切り替える機能:

switch (bar.Type)
{
    case FooType.A:
    break;
    case FooType.B:
    break;
    case FooType.C:
    break;
}
于 2013-08-02T04:30:52.723 に答える
3

はい、名前さえあれば信頼できます。それが「シングルトンパターン」です。シングルトンのセットを作成し、それらをクラスの読み取り専用プロパティとして設定するだけです。フレームワーク全体 使用されます

于 2013-08-02T04:29:12.470 に答える