![](/img/trans.png)
[英]Passing enum at object construction and use its attributes + best way to represent a memory in C#
[英]Best way to represent a parameterized enum in C#?
不熟悉 OCaml 或 Haxe,也不夠聰明,無法理解其他解釋,我去查閱了Haxe 枚舉文檔——底部的“枚舉類型參數”位似乎是相關部分。
基於此,我的理解如下:
“正常”枚舉基本上是一個值,僅限於您在枚舉定義中定義的內容。 C# 示例:
enum Color{ Red, Green, Yellow, Blue };
Color c = Color.Red;
c
可以是Red
、 Green
、 Yellow
或Blue
,但沒有別的。
在 Haxe 中,您可以將復雜類型添加到枚舉,從他們的頁面中設計的示例:
enum Cell<T>{
empty;
cons( item : T, next : Cell<T> )
}
Cell<int> c = <I don't know>;
這似乎意味着c
被限制為empty
字面值(如我們老式的 C# 枚舉),或者它也可以是復雜類型cons(item, next)
,其中item
是T
而next
是Cell<T>
。
從未使用過它,它看起來可能會生成一些匿名類型(例如 C# 編譯器在執行new { Name='Joe'}
時所做的事情。
每當您“訪問”枚舉值時,都必須聲明item
和next
,並且看起來它們被綁定到臨時局部變量。
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.