簡體   English   中英

在C#中使用類來“枚舉對象”是一種很好的做法嗎?

[英]Is the use of a class to “enumerate objects” in C# a good practice?

我知道對象枚舉是Java對C#的少數幾件事之一,有時我認為我錯過了這個特性。

但我已經看到一些情況,一個類用於表示對象的枚舉,使用常量字段,因此它可以“返回一個對象”,而不是一個int。

一個例子是Brushes類。 它的工作方式非常像枚舉。

Brush b = Brushes.Blue;

我們可以看到主要區別(至少對我而言)是需要其他類(類Brush)來存儲從類Brushes返回的值(一些具有隱式運算符重載的代碼可以做到這一點)。

所以,我的問題是:良好的做法?

因為我正在考慮在我的項目中使用它來制作一個動畫(WPF)的枚舉,用於我創建的CustomControl。

這似乎對我好,並且比使用整數枚舉更好,因為我需要檢查一個switch-case來檢測用戶想要的動畫。

在Java和C#中,枚舉是一個根本不同的東西。 在C#中,它們只是整數類型的名稱,在Java中,它們更像是具有命名默認值的類。 在C#中,有一堆靜態只讀字段或屬性的一類就是Java調用一個枚舉,減去的能力switch他們。

這種模式偶爾會出現,請參閱System.Drawing.ColorSystem.Text.Encoding

和大多數事情一樣,只要你不濫用它,這是很好的做法。 此模式通常用於僅為類或結構提供命名的默認值。 確保該類可以獨立存在,並且您不會嚴重依賴這些屬性的名稱。 如果你需要偶爾檢查一下,那么你可能會因為重載==運算符而逃脫。

如果你想要一些與Java的枚舉完全相同的東西,那么你應該有一個內部存儲類型的C#枚舉,並做兩件事之一:

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

是的它是可靠的甚至有一個名字。 這是“ 單身人士模式 ”。 您只需創建一組單例並將它們設置為類的只讀屬性。 它被用於所有 框架

暫無
暫無

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

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