【轉】編寫高品質代碼改善C#程式的157個建議——建議110:用類來代替enum

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.