如何判断是否已设置枚举属性?C#

use*_*534 22 c# enums properties set

我有一个类enum属性,如下所示:

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

public enum Color
{
    Red,
    Green,
}
Run Code Online (Sandbox Code Playgroud)

现在这个类可以像这样初始化:

var foo = new Foo();
Run Code Online (Sandbox Code Playgroud)

没有设置ColorType属性.现在,我正在尝试创建一个方法并对是否设置枚举执行操作,例如我有一个方法

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

然而,我得到一个警告,说值永远不会为空,经过进一步的研究,如果枚举永远不会被设置,如果默认为第一个值,在我的情况下是红色,我在考虑为我的枚举添加一个值是'未设置'并将该值设为第一个,所以如果没有设置,那么枚举将具有'未设置'的值,是否有更好的方法这样做,我提出的方法似乎可能会变得混乱

Mic*_*per 36

您可以使用以下两种方法之一:默认枚举值或可以为空的枚举.

默认枚举值

由于枚举由整数支持,int默认为零,因此枚举将始终默认初始化为等于零的值.除非您明确指定枚举值,否则第一个值将始终为零,第二个值将为1,依此类推.

public enum Color
{
  Undefined,
  Red,
  Green
}

// ...

Assert.IsTrue(Color.Undefined == 0);  // success!
Run Code Online (Sandbox Code Playgroud)

可空的枚举

处理未分配枚举的另一种方法是使用可空字段.

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

// ...

var foo = new Foo();
Assert.IsNull(foo.Color);     // success!
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,但它无法解决用户能够将值设置为null或未定义的问题,因此您不知道用户是否将枚举设置为此或枚举未更改. (2认同)

Sel*_*rio 5

您可以将其设置为底层私有字段可为空,但属性不可以.

例如

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,如果color == null您知道它尚未设置,并且您也停止用户将其设置为null(或undefined其他答案指定).如果colornull你有100%的把握,该用户没有设置它曾经.

只有catch是由此返回的默认值,get但如果它更符合您的程序,您总是可以抛出异常.

set如果给定值不等于默认值(取决于您的用例),您还可以进一步设置字段:

public Color Color
{
    get { return _color ?? Color.Black; }
    set
    {
        if (value != Color)
        {
            _color = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)