读改善c#代码157个建议:建议10~11

目录:

  • 建议10:创建对象时需要考虑是否实现比较器
  • 建议11:区别对待==与Equals

一、建议10:创建对象时需要考虑是否实现比较器

比较一下基本工资:

 class Salary : IComparable
    {
        public string Name { get; set; }
        public decimal BaseSalary { get; set; }         public decimal Bonus { get; set; }
        public int CompareTo(object obj)
        {
            Salary comparer = obj as Salary;            

            if (BaseSalary > comparer.BaseSalary)
            {
                return 1;
            }
            else if (BaseSalary == comparer.BaseSalary)
            {
                return 0;
            }
            else
            {
                return -1;
            }
        }
    }

客户端调用:

 List<Salary> salaries = new List<Salary>();
            salaries.Add(new Salary() { Name = "Sun", BaseSalary = 1000 });
            salaries.Add(new Salary() { Name = "Yuan", BaseSalary = 2000 });
            salaries.Add(new Salary() { Name = "Kun", BaseSalary = 3000 });
            salaries.Add(new Salary() { Name = "Qun", BaseSalary = 3000 });
            salaries.Add(new Salary() { Name = "Sun", BaseSalary = 4000 });

            salaries.Sort();

            foreach (var s in salaries)
            {
                Console.WriteLine("【Name】:{0},【BaseSalary】:¥{1}{2}", s.Name, s.BaseSalary,System.Environment.NewLine);
            }

            Console.ReadKey();

运行:

如果不想用基本工资BaseSalary进行排序,而是以奖金Bonus进行排序,使用IComparer实现自定义比较器:

class BonusComparer : IComparer<Salary>
    {
        public int Compare(Salary x, Sarlary y)
        {           return left.Bonus.CompareTo(right.Bonus);
        }
    }

客户端提供我们上面创建的比较器:

            List<Salary> salaries = new List<Salary>();
            salaries.Add(new Salary() { Name = "Sun", BaseSalary = 1000,Bonus=4000 });
            salaries.Add(new Salary() { Name = "Yuan", BaseSalary = 2000, Bonus = 3000 });
            salaries.Add(new Salary() { Name = "Kun", BaseSalary = 3000, Bonus = 2000 });
            salaries.Add(new Salary() { Name = "Qun", BaseSalary = 3000,Bonus=4000 });
            salaries.Add(new Salary() { Name = "Dun", BaseSalary = 4000,Bonus=0 });

            salaries.Sort(new BonusComparer());

            foreach (var s in salaries)
            {
                Console.WriteLine("Name:【{0}】,BaseSalary:¥{1},Bonus:{2}{3}", s.Name, s.BaseSalary,s.Bonus, System.Environment.NewLine);
            }

            Console.ReadKey();

输出:

二、建议11:区别对待==与Equals

两者都是指相等性,即:值相等性和引用相等性。

值类型:如果值类型相等,返回True。

引用类型:如果指向同一个引用,返回True。

很好理解,举个例子:

1、值类型:==与Equls()

            int x = 1;

            int y = 1;

            Console.WriteLine("int x=1;{0}int y=1;{0}", System.Environment.NewLine,System.Environment.NewLine);

            Console.WriteLine("x==y:{0}",x == y);

            Console.WriteLine("x.Equals(y):{0}{1}",x.Equals(y),System.Environment.NewLine);

            x = y;

            Console.WriteLine("x=y;{0}", System.Environment.NewLine);

            Console.WriteLine("x==y:{0}", x == y);

            Console.WriteLine("x.Equals(y):{0}", x.Equals(y));

            Console.ReadKey();

运行:

2、引用类型

class People
    {
        public String Name { get; set; }
    }

客户端:

            People p1 = new People() { Name = "Sun" };

            People p2 = new People() { Name = "Yuan" };

            Console.WriteLine("People p1 = new People();{0}People p2 = new People();{1}", System.Environment.NewLine, System.Environment.NewLine);

            Console.WriteLine("p1==p2:{0}", p1 == p2);

            Console.WriteLine("p1.Equals(p2):{0}{1}", p1.Equals(p2), System.Environment.NewLine);

            Console.WriteLine("------------------------------------");

            p1 = p2;

            p1.Name = "Moon";

            Console.WriteLine("p1=p2;{0}", System.Environment.NewLine);

            Console.WriteLine("p1==p2:{0}", p1 == p2);

            Console.WriteLine("p1.Equals(p2):{0}", p1.Equals(p2));

运行:

后面我们修改了p1里Name="Moon"的值,但是,p2的Name值也变成了Moon。所以,==与Equal()在比较引用类型时,引用地址一样,返回True

3、引用类型重载Equals()达到值类型比较效果

还有一点,有时我们需要我们的类型看上去和string类型类似,有值类型的感觉。所以说,我们的这个引用类型,需要重载==或者Equals()。

这里建议只重载Equals()来达到像值类型一样的比较效果。保留==,保留引用比较。例如:生活中我们认为身份证号码一样的是同一个人。

 class People
    {
        public String Name { get; set; }
        public string IDCode { get; set; }

        public override bool Equals(object obj)
        {

            People p = obj as People;

            return p.IDCode == IDCode;
        }
    }

客户端:

 People p1 = new People() { IDCode="No1" };

            People p2 = new People() { IDCode = "No1" };

            Console.WriteLine("People p1 = new People();{0}People p2 = new People();{1}", System.Environment.NewLine, System.Environment.NewLine);

            Console.WriteLine("p1.IDCode={0}", p1.IDCode);
            Console.WriteLine("p2.IDCode={0}", p2.IDCode);
            Console.WriteLine();

            Console.WriteLine("p1==p2:{0}【保留引用地址的对比】", p1 == p2);

            Console.WriteLine("p1.Equals(p2):{0}【重载比较IDCode,值类型比较效果】{1}", p1.Equals(p2), System.Environment.NewLine);

            Console.WriteLine("----------------------------------");

            p1 = p2;

            p1.IDCode = "No2";

            Console.ForegroundColor = ConsoleColor.Red;

            Console.WriteLine("p1.IDCode={0}", p1.IDCode);
            Console.WriteLine("p2.IDCode={0}", p2.IDCode);
            Console.WriteLine();

            Console.ForegroundColor = ConsoleColor.White;

            Console.WriteLine("p1=p2;{0}", System.Environment.NewLine);

            Console.WriteLine("p1==p2:{0}", p1 == p2);

            Console.WriteLine("p1.Equals(p2):{0}", p1.Equals(p2));

            Console.ReadKey();

运行:

还有,Object.ReferenceEquals方法比较实例是否相同。验证引用的相等性。

时间: 2024-12-29 01:33:33

读改善c#代码157个建议:建议10~11的相关文章

读改善c#代码157个建议:建议4~6

目录: 建议4:TryParse比Parse好 建议5:使用int?确保值类型也可以为null 建议6:区别 readonly 和 const 的用法 一.建议4:TryParse比Parse 好 TryParse:发生转换异常,内部处理异常.返回false并且result=0 public static bool TryParse(string s, out int result); Parse:发生转换异常,会抛出异常. public static decimal Parse(string

读改善c#代码157个建议:建议13~15

目录: 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dynamic来简化反射实现 一.建议13:为类型输出格式化字符串 有些类型需要我们根据业务需求提供字符串的格式化输出. 1.我们明确知道业务需求什么样的输出格式,也就是类型主动格式化输出. 可以重写Object.ToString()方法,也可以继承IFormattable接口实现ToString,对字符串进行输出. class Person :IFormattable { public string ID

读改善c#代码157个建议:建议7~9

目录: 建议7:将0值作为枚举的默认值 建议8:避免给枚举类型的元素提供显示的值 建议9:习惯运算符重载 一.建议7:将0值作为枚举的默认值 允许使用的枚举类型有:byte.sbyte.short.ushort.int.uint.long.ulong. 不指定值,默认从0开始计数,后面的元素依次+1. enum Week { Monday=1, Tuesday=2, Wednessday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7 } 枚举是值类型

编写高质量代码改善java程序的151个建议——导航开篇

2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长进不了呀. 博客提供的好处就可以交流,讨论的学习方法你们应该知道. 在这里,我会陆陆续续的进行对<编写高质量代码改善java程序的151个建议>看法,希望大家点击交流. 正文 看这本书原因   1.项目做的只是实现功能,然而没有好好

转载-------编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)

阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法              The reasonable man adapts himself to the world; The unreasonable one persists in trying to adapt the world himself. 明白事理的人使自己适应世界:不明事理的人想让世

每周一书-编写高质量代码:改善C程序代码的125个建议

首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10余年开发经验的资深C语言专家全面从C语法和C11标准两大方面深入探讨编写高质量C代码的技巧.禁忌和实践 C语言因为既具有高级语言特性,又具有汇编语言特性,所以它是近二十几年来使用较为广泛.生命力较强的编程语言.无论是操作系统.嵌入式系统.普通应用软件,还是移动智能设备开发,它都能够很好地胜任,是公认的强大的语

代码质量优先——《编写高质量代码:改善c程序代码的125个建议》

高质量的代码不但可以促进团队合作.减少bug处理.降低维护成本,对程序员自身的成长也是至关重要的.很难想象一个参考<如何编写无法维护的代码>写代码的程序员技术成长的上限有多么低.为了写出高质量的代码,我们需要听取过来人的改善代码质量的经验,<编写高质量代码:改善c程序代码的125个建议>就是一本能让人写出高质量代码的好书. 本书的第三章<程序控制语句应该保持简洁高效>首先用简练的语言介绍了流程控制结构的概念,然后提供了对if.else.for.do-while.swit

[ 转 ]编写高质量代码:改善Java程序的151个建议

记得3年前刚到公司,同桌同事见我无事可做就借我看<编写高质量代码:改善Java程序的151个建议>这本书,当时看了几页没上心就没研究了.到上个月在公司偶然看到,于是乎又找来看看,我的天,真是非常多的干货,对于我这种静不下心的人真是帮助莫大呀. 看完整本书,也记了不少笔记,我就分享一部分个人觉得有意义的内容,也为了方便以后自己温习. --警惕自增陷阱 i++表示先赋值后自增,而++i表示先自增后赋值.下面的代码返回结果为0,因为lastAdd++有返回值,而返回值是自增前的值(在自增前变量的原始

转载--编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议65~69)

阅读目录 建议65:避开基本类型数组转换列表陷阱 建议66:asList方法产生的List的对象不可更改 建议67:不同的列表选择不同的遍历算法 建议68:频繁插入和删除时使用LinkList 建议69:列表相等只关心元素数据 回到顶部 建议65:避开基本类型数组转换列表陷阱 我们在开发中经常会使用Arrays和Collections这两个工具类和列表之间转换,非常方便,但也有时候会出现一些奇怪的问题,来看如下代码: 1 public class Client65 { 2 public stat