实现System.IComparable接口的一个问题
来源:互联网 发布:c语言实现base64编码 编辑:程序博客网 时间:2024/06/05 10:27
public sealed class Person : System.IComparable {
internal int age;
public int CompareTo(object rhs) {
if (this == rhs) return 0; // 相同
Person other = (Person)rhs;
if (other.age > this.age) return -1;
else if (other.age < this.age) return 1;
else return 0;
}
}
internal int age;
public int CompareTo(object rhs) {
if (this == rhs) return 0; // 相同
Person other = (Person)rhs;
if (other.age > this.age) return -1;
else if (other.age < this.age) return 1;
else return 0;
}
}
你可以在CompareTo方法中,对复合的if-else语句进行修改,如下所示:
return this.age - other.age;
如果this.age大于other.age,该方法将返回一个正数;如果两个值相等,该方法返回零;否则,该方法返回一个负数。
-----------------------------------------------------------------------------
我们考虑以下测试程序:
using System;
namespace Benben.Test.EssentialNet.Chapter5
{
public sealed class Person : IComparable
{
internal int age;
public int CompareTo(object rhs)
{
if (this == rhs) return 0; // 相同
Person other = (Person)rhs;
return this.age - other.age;
}
}
sealed class Test
{
static void Main()
{
Person Lippman = new Person();
Person Richter = new Person();
Lippman.age = int.MaxValue;
Richter.age = -1;
int cmp = Lippman.CompareTo(Richter);
string str = (cmp > 0) ? ">" : ((cmp < 0) ? "<" : "=");
Console.WriteLine("Lippman.age: {0:N0}", Lippman.age);
Console.WriteLine("Richter.age: {0:N0}", Richter.age);
Console.WriteLine("ComperTo return: {0:N0}", cmp);
Console.WriteLine("Comper result: Lippman {0} Richter", str);
}
}
}
namespace Benben.Test.EssentialNet.Chapter5
{
public sealed class Person : IComparable
{
internal int age;
public int CompareTo(object rhs)
{
if (this == rhs) return 0; // 相同
Person other = (Person)rhs;
return this.age - other.age;
}
}
sealed class Test
{
static void Main()
{
Person Lippman = new Person();
Person Richter = new Person();
Lippman.age = int.MaxValue;
Richter.age = -1;
int cmp = Lippman.CompareTo(Richter);
string str = (cmp > 0) ? ">" : ((cmp < 0) ? "<" : "=");
Console.WriteLine("Lippman.age: {0:N0}", Lippman.age);
Console.WriteLine("Richter.age: {0:N0}", Richter.age);
Console.WriteLine("ComperTo return: {0:N0}", cmp);
Console.WriteLine("Comper result: Lippman {0} Richter", str);
}
}
}
运行结果如下:
Lippman.age: 2,147,483,647
Richter.age: -1
ComperTo return: -2,147,483,648
Comper result: Lippman < Richter
该测试程序得到了错误的比较结果。可见,大师也有考虑不周到的地方。 :)
如果使用 /checked+ 参数重新编译该程序,再运行时将抛出一个System.OverflowException异常,也就是说算术运算导致溢出。这就是导致错误的比较结果的原因。
当然,人的年龄既不可能是负数,也不可能太大。实际上,把age字段的类型改为short或者ushort就可以避免这个问题。
如果真的需要比较两个int或者long类型的数,还是老老实实地使用复合的if-else语句可靠。 :)
0 0
- 实现System.IComparable接口的一个问题
- IComparable 接口的实现
- 实现Icomparable接口(C#)
- IComparable 和IComparer 接口实现数组的自定义排列
- 两个对象之间的比较,实现接口IComparable
- c# 实现IComparable、IComparer接口、Comparer类的详解
- net2003转到net2005碰到的一个问题:不会实现接口成员“System.Web.IHttpHandler.IsReusable”
- 笔记(显示实现接口,实现IComparable,IComparer接口来排序)
- 《Effective C#》 Item 26:对需要排序的对象实现IComparable和IComparer接口
- 实现IComparable
- C#中IComparable接口和IComparer接口应用的实例
- Effective C# 使用IComparable和IComparer接口实现排序关系
- IComparable和Icomparer接口
- IComparable接口示例代码
- IComparable和IComparer接口
- [C#高质量代码的建议]IComparable(Of T) 接口
- 对象的比较与排序:IComparable和IComparer接口
- 对象的比较与排序:IComparable和IComparer接口
- ARX创建新图层,设置颜色,并置为当前图层
- zoj 3450Doraemon's Railgun
- struts2 环境配置
- ReactiveCocoa与Functional Reactive Programming
- 链式前向星模板
- 实现System.IComparable接口的一个问题
- 软件工程之面向对象
- HUD 1255 面积覆盖 线扫描
- ZOJ 3450 Doraemon's Railgun (DP·分组背包)
- 动态规划(dp)入门解题报告
- 禁用BeagleBone Black 的 HDMI Cape
- Javascript、Jquery获取浏览器和屏幕各种高度宽度
- Rabbits and Recurrence Relations
- An object provides services(每个对象都提供服务)