国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

編寫高質(zhì)量代碼改善C#程序的157個建議[10-12]

2019-11-17 03:15:36
字體:
供稿:網(wǎng)友

編寫高質(zhì)量代碼改善C#程序的157個建議[10-12]

前言

  本文已更新至http://m.survivalescaperooms.com/aehyok/p/3624579.html。本文主要學(xué)習(xí)記錄以下內(nèi)容:

  建議10、創(chuàng)建對象時需要考慮是否實現(xiàn)比較器

  建議11、區(qū)別對待==和Equals

  建議12、重寫Equals時也要重寫GetHashCode

建議10、創(chuàng)建對象時需要考慮是否實現(xiàn)比較器

  有對象的地方就會存在比較,就像小時候每次拿著考卷回家,媽媽都會問你隔壁的那誰誰誰考了多少分呀。下面我們也來舉個簡單的例子,就是有幾個人的Salary列表。我們根據(jù)基本工資來進行羅列:

    class PRogram    {        static void Main(string[] args)        {            ArrayList array = new ArrayList();            array.Add(1100);            array.Add(1200);            array.Add(1160);            array.Sort();            foreach (var obj in array)            {                Console.WriteLine(obj.ToString());            }            Console.ReadLine();        }    }

可以發(fā)現(xiàn)通過ArrayList.Sort()方法即可完成排序的任務(wù)。不過ArrayList這里只能是一個字段的。假如有姓名、工資兩個字段,然后根據(jù)工資進行排序那么按照現(xiàn)在的情況來看,ArrayList是無法實現(xiàn)的。所以接口IComparable現(xiàn)在可以派上用場了。現(xiàn)在先定義一個實體,并且實現(xiàn)接口IComparable。

public class Salary:IComparable    {        /// <summary>        /// 姓名        /// </summary>        public string Name { get; set; }        /// <summary>        /// 基本工資        /// </summary>        public int BaseSalary { get; set; }        /// <summary>        /// 實現(xiàn)IComparable接口        /// </summary>        /// <param name="obj"></param>        /// <returns></returns>        public int CompareTo(object obj)        {            Salary staff = obj as Salary;            if (BaseSalary > staff.BaseSalary)            {                return 1;            }            else if (BaseSalary == staff.BaseSalary)            {                return 0;            }            else            {                return -1;            }        }    }

進行排序

                ArrayList array = new ArrayList();                array.Add(new Salary() { Name = "aehyok", BaseSalary = 12000 });                array.Add(new Salary() { Name = "Kris", BaseSalary = 11200 });                array.Add(new Salary() { Name = "Leo", BaseSalary = 18000 });                array.Add(new Salary() { Name = "Niki", BaseSalary = 20000 });                array.Sort();                foreach (Salary obj in array)                {                    Console.WriteLine(string.Format("{0} BaseSalary:{1}", obj.Name, obj.BaseSalary));                }                Console.ReadLine();

如果未繼承Icomparable接口。那么會出現(xiàn)如下錯誤。

正確的進行排序,結(jié)果如下所示

假如現(xiàn)在在Salary類中添加了一個獎金的字段如下

public class Salary:IComparable    {        /// <summary>        /// 姓名        /// </summary>        public string Name { get; set; }        /// <summary>        /// 基本工資        /// </summary>        public int BaseSalary { get; set; }        /// <summary>        /// 獎金        /// </summary>        public int Bouns { get; set; }        /// <summary>        /// 實現(xiàn)IComparable接口        /// </summary>        /// <param name="obj"></param>        /// <returns></returns>        public int CompareTo(object obj)        {            Salary staff = obj as Salary;            if (BaseSalary > staff.BaseSalary)            {                return 1;            }            else if (BaseSalary == staff.BaseSalary)            {                return 0;            }            else            {                return -1;            }        }    }

再繼續(xù)假如,現(xiàn)在又要以Bouns獎金字段進行排序,那應(yīng)該怎么處理呢?當(dāng)然修改Salary實體類中繼承的接口方法進行處理肯定是沒問題了,但是比較麻煩。我們可以采用自定義比較接口IComparer來實現(xiàn)。

    public class BounsComparer:IComparer    {        public int Compare(object x, object y)        {            Salary s1 = x as Salary;            Salary s2 = y as Salary;            return s1.Bouns.CompareTo(s2.Bouns);        }    }

然后重新進行排序

                ArrayList array = new ArrayList();                array.Add(new Salary() { Name = "aehyok", BaseSalary = 12000,Bouns=500 });                array.Add(new Salary() { Name = "Kris", BaseSalary = 11200,Bouns=400 });                array.Add(new Salary() { Name = "Leo", BaseSalary = 18000,Bouns=300 });                array.Add(new Salary() { Name = "Niki", BaseSalary = 20000,Bouns=700 });                array.Sort(new BounsComparer());                foreach (Salary obj in array)                {                    Console.WriteLine(string.Format("{0} /tBaseSalary:{1}/tBouns{2}", obj.Name, obj.BaseSalary,obj.Bouns));                }                Console.ReadLine();

結(jié)果如下所示

注意,剛才實現(xiàn)接口名字叫IComparable,而自定義的比較器接口是IComparer

如果我們稍有經(jīng)驗,會發(fā)現(xiàn)如下函數(shù)中的問題

        public int Compare(object x, object y)        {            Salary s1 = x as Salary;            Salary s2 = y as Salary;            return s1.Bouns.CompareTo(s2.Bouns);        }

這個函數(shù)中進行了轉(zhuǎn)型處理,這是會影響性能的。如果集合中有成千上萬個復(fù)雜的實體對象,那么進行排序時耗費的時間是巨大的。所以泛型登場,很好的解決了這個問題。

因此以上代碼中的ArrayList,可以替換為List<T>,對應(yīng)的我們就應(yīng)該實現(xiàn)IComparable<T>和IComparer<T>。

實現(xiàn)的代碼如下:

1、實體類實現(xiàn)接口IComparable<T> 2、自定義比較器實現(xiàn)接口IComparer<T> 3、進行排序的調(diào)用

    public class Salary:IComparable<Salary>    {        /// <summary>        /// 姓名        /// </summary>        public string Name { get; set; }        /// <summary>        /// 基本工資        /// </summary>        public int BaseSalary { get; set; }        /// <summary>        /// 獎金        /// </summary>        public int Bouns { get; set; }        /// <summary>        /// 實現(xiàn)IComparable接口        /// </summary>        /// <param name="obj"></param>        /// <returns></returns>        public int CompareTo(Salary other)        {            return BaseSalary.CompareTo(other.BaseSalary);        }    }
    public class BounsComparer : IComparer<Salary>    {        public int Compare(Salary x, Salary y)        {            return x.Bouns.CompareTo(y.Bouns);        }    }
                List<Salary> array =new List<Salary>();                array.Add(new Salary() { Name = "aehyok", BaseSalary = 12000,Bouns=500 });                array.Add(new Salary() { Name = "Kris", BaseSalary = 11200,Bouns=400 });                array.Add(new Salary() { Name = "Leo", BaseSalary = 18000,Bouns=300 });                array.Add(new Salary() { Name = "Niki", BaseSalary = 20000,Bouns=700 });                array.Sort(new BounsComparer());                foreach (Salary obj in array)                {                    Console.WriteLine(string.Format("{0} /tBaseSalary:{1}/tBouns{2}", obj.Name, obj.BaseSalary,obj.Bouns));                }                Console.ReadLine();

最終結(jié)果

建議11、區(qū)別對待==和Equals

這里我之前有一篇博文針對==和Equals有過專門的介紹,在此就不再進行過多的闡述了http://m.survivalescaperooms.com/aehyok/p/3505000.html

建議12、重寫Equals時也要重寫GetHashCode

下面先來看一個簡單的小例子,定義如下實體類:

    public class Person    {        public string IDCode { get;private set; }        public Person(string idCode)        {            this.IDCode = idCode;        }        public override bool Equals(object obj)        {            return IDCode == (obj as Person).IDCode;        }    }

針對上面實體類進行編譯

這里會有一個提示暫時先不管

    public class PersonMoreInfo    {        public string SomeThing { get; set; }    }

通過這兩個實體類,我們來使用以下Dictionary類型,代碼如下:

    class Program    {        static Dictionary<Person, PersonMoreInfo> PersonValues = new Dictionary<Person, PersonMoreInfo>();        static void Main(string[
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 苏尼特右旗| 奉贤区| 金平| 平遥县| 如东县| 雷州市| 科尔| 浑源县| 彭阳县| 宜宾市| 老河口市| 榆中县| 监利县| 宁强县| 教育| 延长县| 梓潼县| 江门市| 双鸭山市| 林州市| 普宁市| 中宁县| 西乌珠穆沁旗| 安乡县| 青浦区| 分宜县| 渝北区| 大埔区| 苍梧县| 临湘市| 琼海市| 绥芬河市| 芜湖县| 仙游县| 安义县| 无为县| 土默特右旗| 南投县| 荣成市| 武威市| 泽州县|