簡體   English   中英

在 C# 中表示參數化枚舉的最佳方式?

[英]Best way to represent a parameterized enum in C#?

是否有任何好的解決方案來表示C# 3.0中的參數化枚舉? 我正在尋找像OCamlHaxe這樣的東西。 我現在只能想到 class 層次結構,帶有一個簡單的枚舉字段以便於切換,也許有更好的想法?

請參閱下面其中一個回復中的 Ocaml 示例,以下是 Haxe 代碼:

enum Tree {
   Node(left: Tree, right: Tree);
   Leaf(val: Int);
}

不熟悉 OCaml 或 Haxe,也不夠聰明,無法理解其他解釋,我去查閱了Haxe 枚舉文檔——底部的“枚舉類型參數”位似乎是相關部分。

基於此,我的理解如下:

“正常”枚舉基本上是一個值,僅限於您在枚舉定義中定義的內容。 C# 示例:

enum Color{ Red, Green, Yellow, Blue };
Color c = Color.Red;

c可以是RedGreenYellowBlue ,但沒有別的。

在 Haxe 中,您可以將復雜類型添加到枚舉,從他們的頁面中設計的示例:

enum Cell<T>{ 
  empty; 
  cons( item : T, next : Cell<T> )
}

Cell<int> c = <I don't know>;

似乎意味着c被限制為empty字面值(如我們老式的 C# 枚舉),或者它也可以是復雜類型cons(item, next) ,其中itemTnextCell<T>

從未使用過它,它看起來可能會生成一些匿名類型(例如 C# 編譯器在執行new { Name='Joe'}時所做的事情。
每當您“訪問”枚舉值時,都必須聲明itemnext ,並且看起來它們被綁定到臨時局部變量。

Haxe 示例 - 您可以看到 'next' 被用作臨時局部變量以從匿名 cons 結構中提取數據:

switch( c ) {
  case empty : 0;
  case cons(item,next): 1 + cell_length(next);
}

老實說,當我“點擊”它似乎在做什么時,這讓我大吃一驚。 它看起來非常強大,我明白您為什么要在 C# 中尋找類似的功能。

C# 枚舉與最初復制它們的 C/++ 枚舉幾乎相同。 這基本上是#define Red 1的一種很好的說法,因此當您傳遞Color對象時,編譯器可以使用整數而不是字符串進行比較和存儲。

我在 C# 中這樣做的嘗試是使用 generics 和接口。 像這樣的東西:

public interface ICell<T> {
   T Item{ get; set; }
   ICell<T>{ get; set; }
}

class Cons<T> : ICell<T> {
  public T Item{ get; set; } /* C#3 auto-backed property */
  public Cell<T> Next{ get; set; }
}

class EmptyCell<T> : ICell<T>{
  public T Item{ get{ return default(T); set{ /* do nothing */ }; }
  public ICell<T> Next{ get{ return null }; set{ /* do nothing */; }
}

然后你可以有一個List<ICell<T>>包含項目和下一個單元格,你可以在末尾插入EmptyCell (或者只是將Next引用顯式設置為 null)。 優點是因為EmptyCell不包含成員變量,它不需要任何存儲空間(如 Haxe 中的empty ),而Cons單元格則需要。
編譯器還可以內聯/優化EmptyCell中的方法,因為它們什么都不做,因此與僅將其成員數據集為 null 的Cons相比,速度可能會有所提高。

我真的不知道。 我歡迎任何其他可能的解決方案,因為我對我的解決方案並不特別自豪:-)

使用具有static屬性的 class 來表示枚舉值。 您可以選擇使用私有構造函數通過 static 屬性將所有對 class 的引用強制為 go。

看看System.Drawing.Color class。 它使用這種方法。

C#(據我所知,一般是 .NET 框架)不支持像 Java 那樣的參數化枚舉。 話雖如此,您可能想查看屬性。 Java 枚舉能夠實現的一些功能在某種程度上可以通過屬性實現。

僅使用 class 有什么問題? 它很難看,但 Java 的人就是這樣做的,直到他們擁有語言集成的 Enum 支持!

暫無
暫無

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

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