[英]Is it a good practice not to use Message field of an Exception class in 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.Color
和System.Text.Encoding
和大多數事情一樣,只要你不濫用它,這是很好的做法。 此模式通常用於僅為類或結構提供命名的默認值。 確保該類可以獨立存在,並且您不會嚴重依賴這些屬性的名稱。 如果你需要偶爾檢查一下,那么你可能會因為重載==
運算符而逃脫。
如果你想要一些與Java的枚舉完全相同的東西,那么你應該有一個內部存儲類型的C#枚舉,並做兩件事之一:
例:
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.