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

时间:2013-05-14 23:48:15

标签: c# properties enums set

我有一个带枚举属性的类:

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
    }
}

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

6 个答案:

答案 0 :(得分:33)

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

默认枚举值

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

public enum Color
{
  Undefined,
  Red,
  Green
}

// ...

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

Nullable enum

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

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

// ...

var foo = new Foo();
Assert.IsNull(foo.Color);     // success!

答案 1 :(得分:5)

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

E.g。

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;
        }
    }
}

答案 2 :(得分:2)

你有两个真正的选择。第一种是向枚举添加未定义的值。这将是初始化属性之前的默认值。

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
    }
}

答案 3 :(得分:1)

枚举是Value Types,这意味着它们不是对存储在其他地方的对象的引用,因此它们不能是null。它们总是有一个默认值,就像int一样,在创建时默认为零。我建议采用两种方法:

  1. 添加另一个名为None的枚举条目,其值等于零。这样,您的枚举值在创建时将默认为None。然后,您可以查看if(foo.ColorType != Color.None)

  2. Color属性设为可以为空的public Color? ColorType { get; set; }。现在它将默认为null,并且可以为其分配值null。在此处详细了解nullable类型:MSDN - Nullable Types (C#)

答案 4 :(得分:0)

enum是一个值类型,因此它不能为null,并且存储通常是一个整数。如果你想为你的类型定义一个未定义的值,你可能有

public enum Color
{
    Undefined,
    Red,
    Green,
}

答案 5 :(得分:0)

正如您所发现的,C#中的枚举是值类型(它们本质上是整数)而不是引用类型,因此它们不会默认为NULL,而是枚举中的最小整数值。处理枚举时不要忘记这种关系,因为它是最有用的属性之一。永远记住,无论你是否明确说明,

public enum Color
{
    Red,
    Green
}

等同于:

public enum Color
{
    Red = 0,
    Green = 1
}

虽然您当然可以为每个枚举成员提供您喜欢的任何整数值。

至于是否有更好的方法,这实际上取决于“这个”是什么,尽管你的建议只是简单地使用以下枚举设置没有错:

public enum Color
{
    None = 0,
    Red,
    Green
}

通常,当您希望能够通过名称选择一组有限且离散的可能值时,您希望使用枚举。例如,假设我有一个方法,它采用4个基本方向之一(北,东,南,西)作为参数。我决定按顺时针顺序为每个方向编号,从0开始为North。

public enum Direction
{
    North = 0,
    East,
    South,
    West
}

现在,我没有让我的函数接受一个整数参数,而是相信我会记住每个数字引用的内容,我现在可以让函数将枚举成员作为参数,并立即知道我正在处理哪个方向。例如:

getNeighbor(1);

读起来更容易:

getNeighbor(Direction.East);