4

我想知道,因为 MSDN 文档说以下内容:

小于零:此实例小于值。

零:此实例等于值。

大于零:此实例大于值。

如果您只想比较一个值是小于、等于还是大于,为什么不直接使用 -1、0 和 1?

4

4 回答 4

4

这个问题可能很宽泛,但至少知道我的公司正在使用许多这样的实现,因为我写了它们:

public int CompareTo(Student other)
{
  return this.Grade - student.Grade;
}
于 2013-03-01T12:25:10.000 回答
4

这里有两件事需要考虑。

  1. 记录了什么
  2. 实施了什么

实际的实现目前可能总是返回 -1、0 或 1,而不是其他任何值。请注意,我尚未对此进行验证。

但是,文档指定使用负值和正值是合法的,而不仅仅是 -1 和 +1。

这意味着要使用 编写健壮的代码.CompareTo,您需要处理负值和正值,而不仅仅是 -1 和 +1。

请注意,这并不意味着您不能从您自己的 实现中返回-1 和 +1 CompareTo,但您还需要为任何其他值做好准备。

为简单起见,在某些情况下,实现可能只是返回从另一个值中减去一个值的结果,因此您将得到不是 -1 或 +1 的结果。

于 2013-03-01T12:25:10.770 回答
2

如果您将查看CompareTo诸如 , 等类型的实现ByteInt16您将看到

public int CompareTo(short value)
{
    return (this - value);
}

Int32Int64比较没有以相同的方式实现。更新:正如@ORMapper 所注意到的,因为算术溢出。

于 2013-03-01T12:29:07.577 回答
1

据我了解,有很多(特别是用户定义的)。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) 的整数,其中最小值减去最大值将适合。

于 2013-03-01T12:29:06.287 回答