24

次のような列挙型プロパティを持つクラスがあります。

public class Foo
{
    public Color ColorType {get;set;}
}

public enum Color
{
    Red,
    Green,
}

これで、このクラスは次のように初期化できます。

var foo = new Foo();

ColorType プロパティが設定されていない場合。今、メソッドを作成し、その列挙型が設定されているかどうかに関係なくアクションを実行しようとしています。たとえば、メソッドがあります

private void checkEnum(Foo foo)
{
    if(foo.ColorType !=null)
    {
        //perform these actions
    }else
    {
        //perform those actions
    }
}

ただし、値がnullになることは決してないという警告が表示され、さらに調査したところ、列挙型が設定されていない場合、デフォルトで最初の値が赤になる場合、列挙型に値を追加することを考えていました。 「設定されていません」で、その値を最初の値にします。設定されていない場合、列挙型の値は「設定されていません」になります。これを行うためのより良い方法はありますか?

4

7 に答える 7

44

次の 2 つの方法のいずれかを使用できます: デフォルトの列挙値または null 許容列挙。

デフォルトの列挙値

列挙型は整数によってサポートされ、intデフォルトでゼロに設定されるため、列挙型はデフォルトで常にゼロに相当する値に初期化されます。列挙型の値を明示的に割り当てない限り、最初の値は常にゼロ、2 番目の値は 1 というようになります。

public enum Color
{
  Undefined,
  Red,
  Green
}

// ...

Assert.IsTrue(Color.Undefined == 0);  // success!

Null 許容列挙型

割り当てられていない列挙型を処理するもう 1 つの方法は、null 許容フィールドを使用することです。

public class Foo
{
   public Color? Color { get; set; }
}

// ...

var foo = new Foo();
Assert.IsNull(foo.Color);     // success!
于 2013-05-14T23:56:39.613 に答える
6

基になるプライベート フィールドが null 許容になるようにすることはできますが、プロパティはそうではありません。

例えば

class SomeClass
{
    private Color? _color; // defaults to null

    public Color Color
    {
        get { return _color ?? Color.Black; }
        set { _color = value; }
    }

    public bool ColorChanged
    {
        get { return _color != null; }
    }
}

そうすればcolor == null、まだ設定されていないことがわかっていて、ユーザーが設定するのを止めている場合null(またはundefined他の回答が指定しているように)。ユーザーがこれまでに設定したことcolornullないことは 100% 確実です。

によって返されるデフォルト値は catch のみですgetが、プログラムにより適している場合はいつでも例外をスローできます。

set指定された値がデフォルト値と等しくない場合にのみフィールドを設定するようにすることで、さらに一歩進めることもできます(ユースケースによって異なります)。

public Color Color
{
    get { return _color ?? Color.Black; }
    set
    {
        if (value != Color)
        {
            _color = value;
        }
    }
}
于 2013-05-24T03:52:01.937 に答える
3

2 つの実際のオプションがあります。1 つ目は、enum に未定義の値を追加することです。これは、プロパティが初期化される前のデフォルト値になります。

1)

public enum Color
{
    Undefined,
    Red,
    Green,
}

あなたの小切手で:

private void checkEnum(Foo foo)
{
    if(foo.ColorType == Color.Undefined)
    {
        //perform these actions
    }else
    {
        //perform those actions
    }
}

2)または、未定義の値を追加してプロパティを作成することはできませんNullable

public class Foo
{
    public Color? ColorType {get;set;}
}
public enum Color
{
    Red,
    Green,
}

そして、次のようにチェックを実行します。

private void checkEnum(Foo foo)
{
    if(!foo.ColorType.HasValue)
    {
        //perform these actions
    }else
    {
        //perform those actions
    }
}
于 2013-05-14T23:58:33.073 に答える