簡體   English   中英

如何判斷枚舉屬性是否已設置? C#

[英]How to tell if an enum property has been set? C#

我有一個 class,它的枚舉屬性如下:

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

public enum Color
{
    Red,
    Green,
}

現在這個 class 可以像這樣初始化:

var foo = new Foo();

沒有設置 ColorType 屬性。 現在,我正在嘗試創建一個方法並對是否設置過該枚舉執行操作,例如我有一個方法

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

但是我收到一條警告說該值永遠不會是 null 並且經過進一步研究,如果從未設置枚舉如果將默認為第一個值,在我的情況下將是紅色,我正在考慮向我的枚舉添加一個值這將“未設置”並將該值設置為第一個,因此如果尚未設置,則枚舉將具有“未設置”的值,是否有更好的方法來執行此操作,我提出的方法似乎會變得混亂

您可以使用以下兩種方法之一:默認枚舉值或可為空的枚舉。

默認枚舉值

由於枚舉由整數支持,並且int默認為零,因此默認情況下枚舉將始終初始化為等效於零的值。 除非您明確分配枚舉值,否則第一個值將始終為零,第二個值為 1,依此類推。

public enum Color
{
  Undefined,
  Red,
  Green
}

// ...

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

可為空的枚舉

處理未分配枚舉的另一種方法是使用可為空的字段。

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

// ...

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

您可以使基礎私有字段可以為空,但屬性不是。

例如

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

你有兩個真正的選擇。 第一個是向枚舉添加一個未定義的值。 這將是屬性初始化之前的默認值。

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

枚舉是值類型,這意味着它們不是對存儲在其他地方的對象的引用,因此它們不能為null 它們總是有一個默認值,就像int一樣,在創建時默認為零。 我建議兩種方法:

  1. 添加另一個名為例如None枚舉條目,其值等於零。 這樣你的枚舉值在創建時將默認為None 然后你可以檢查if(foo.ColorType != Color.None)

  2. 使您的Color屬性成為可空屬性,例如: public Color? ColorType { get; set; } public Color? ColorType { get; set; } public Color? ColorType { get; set; } . 現在它將默認為null並且可以分配值null 在此處閱讀有關nullable類型的更多信息: MSDN - Nullable Types (C#)

嘗試這個:

private void checkEnum(Color color)
{
    if(string.IsNullOrEmpty(color.ToString()))
    {
        //value is not set
    }
     else
    {
        //value is set
    }
}

enum是值類型所以不能為null,存儲一般是整數。 如果你想要一個未定義的類型值,你可能有

public enum Color
{
    Undefined,
    Red,
    Green,
}

正如您所發現的,C# 中的枚舉是值類型(它們本質上是整數)而不是引用類型,因此它們不會默認為 NULL,而是枚舉中最低的整數值。 在處理枚舉時不要忽視這種關系,因為這是它們最有用的屬性之一。 永遠記住,無論你是否明確說明,

public enum Color
{
    Red,
    Green
}

相當於:

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

盡管您當然可以為每個枚舉成員提供您喜歡的任何整數值。

至於是否有更好的方法來做到這一點,這實際上完全取決於“這個”是什么,盡管您建議簡單地使用以下枚舉設置並沒有錯:

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

通常,當您希望能夠通過名稱從中選擇一組絕對有限且離散的可能值時,您希望使用枚舉。 例如,假設我有一個方法,它將 4 個基本方向(北、東、南、西)之一作為參數。 我決定按順時針順序對每個方向進行編號,從 0 開始表示北。

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

現在,不是讓我的函數采用整數參數並相信我會記住每個數字所指的內容,我現在可以讓函數采用枚舉成員作為參數並立即知道我正在處理的方向。 例如:

getNeighbor(1);

閱讀起來更容易,因為:

getNeighbor(Direction.East);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM