我想知道,因为 MSDN 文档说以下内容:
小于零:此实例小于值。
零:此实例等于值。
大于零:此实例大于值。
如果您只想比较一个值是小于、等于还是大于,为什么不直接使用 -1、0 和 1?
这个问题可能很宽泛,但我至少知道我的公司正在使用许多这样的实现,因为我写了它们:
public int CompareTo(Student other)
{
return this.Grade - student.Grade;
}
这里有两件事需要考虑。
实际的实现目前可能总是返回 -1、0 或 1,而不是其他任何值。请注意,我尚未对此进行验证。
但是,文档指定使用负值和正值是合法的,而不仅仅是 -1 和 +1。
这意味着要使用 编写健壮的代码.CompareTo
,您需要处理负值和正值,而不仅仅是 -1 和 +1。
请注意,这并不意味着您不能从您自己的 实现中返回-1 和 +1 CompareTo
,但您还需要为任何其他值做好准备。
为简单起见,在某些情况下,实现可能只是返回从另一个值中减去一个值的结果,因此您将得到不是 -1 或 +1 的结果。
如果您将查看CompareTo
诸如 , 等类型的实现Byte
,Int16
您将看到
public int CompareTo(short value)
{
return (this - value);
}
Int32
或Int64
比较没有以相同的方式实现。更新:正如@ORMapper 所注意到的,因为算术溢出。
据我了解,有很多(特别是用户定义的)。MSDN 是非特定的,因为您不应该依赖它,CompareTo 产生的值并不重要,只要它有效。例如int
,通过减去它们来比较两个 s 是最快的。
一个真实的例子,这个程序打印88
.
static void Main(string[] args)
{
Int16 a = 100;
Int16 b = 12;
Console.WriteLine(a.CompareTo(b));
}
在做这个小调查时,我发现一开始似乎有点奇怪。Int16
( short
) 使用此方法,但Int32
( int
) 不使用并返回-1
, 0
, 1
。这可能是因为我们正在使用小于返回类型 ( Int32
) 的整数,其中最小值减去最大值将适合。