標籤:override ida 基類 case eal multi 實現 val 提升
建議110:用類來代替enum
枚舉(enum)用來表示一組固定的值。例如,為了表示星期資訊,我們可以定義枚舉Week:
enum Week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
枚舉最大的優點在於它的類型是實值型別。相比較參考型別來說,它可以在關鍵演算法中提升效能,因為它不需要建立在“堆”中。但是,如果不考慮這方面的因素,我們不妨讓類(參考型別)來代替枚舉。代碼如下:
class Week { public static readonly Week Monday = new Week(0); public static readonly Week Tuesday = new Week(1); //省略 private int _infoType; private Week(int infoType) { _infoType = infoType; } }
我們將類型Week的構造方法實現為private,這有效阻止了類型在外部產生類的執行個體,使它的行為更接近於枚舉。
類Week相比枚舉Week的優點在於,它能夠添加方法或重寫基類方法,以便提供豐富的功能。以星期為例,如果要提供更有意義的字串,如指定Monday是星期一,對於枚舉來說,這並不是天然支援的。甚至會大費周折。曾經有人實現過枚舉的這種功能:
enum Week { [EnumDescription("星期一")] Monday, [EnumDescription("星期二")] Tuesday } [AttributeUsage(AttributeTargets.Field, AllowMultiple = false)] public sealed class EnumDescriptionAttribute : Attribute { private string description; public string Description { get { return this.description; } } public EnumDescriptionAttribute(string description) : base() { this.description = description; } } public static class EnumHelper { public static string GetDescription(Enum value) { if (value == null) { throw new ArgumentNullException("value"); } string description = value.ToString(); FieldInfo fieldInfo = value.GetType().GetField(description); EnumDescriptionAttribute[] attributes = (EnumDescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute), false); if (attributes != null && attributes.Length > 0) { description = attributes[0].Description; } return description; } } static void Main(string[] args) { Console.WriteLine(EnumHelper.GetDescription(Week.Monday)); }
輸出:
星期一
如果不為枚舉元素加上屬性EnumDescription特性,我們只能使用:
Console.WriteLine(EnumHelper.GetDescription(Week.Monday));
輸出:
Monday
如果在類中,就不會有枚舉的這種不方便了,因為可以通過重寫object的ToString方法將問題解決。代碼如下:
static void Main(string[] args) { Console.WriteLine(Week.Monday); } class Week { public static readonly Week Monday = new Week(0); public static readonly Week Tuesday = new Week(1); //省略 private int _infoType; private Week(int infoType) { _infoType = infoType; } public override string ToString() { switch (_infoType) { case 0: return "星期一"; case 1: return "星期二"; default: throw new Exception("不正確的星期資訊!"); } } }
相比枚舉而言,類能賦予類型更多的行為。當然,如果應用場合滿足如下特性,我們就應該更多的考慮使用枚舉:
- 效率。這源於枚舉是實值型別。
- 類型用於內部,不需要增加更多的行為屬性。
- 類型元素不需要提供附加的特性。
轉自:《編寫高品質代碼改善C#程式的157個建議》陸敏技
【轉】編寫高品質代碼改善C#程式的157個建議——建議110:用類來代替enum