是否有任何已知的.CompareTo(对象值)方法实现实际返回小于-1或大于1的值?

时间:2013-03-01 12:21:58

标签: c# .net clr

我想知道因为MSDN文档说明如下:

  

小于零:此实例小于值。

     

零:此实例等于值。

     

大于零:此实例大于值。

如果您只想比较一个小于,等于或大于的值,为什么不只使用-1,0和1?

4 个答案:

答案 0 :(得分:4)

这个问题可能是广泛的,但至少知道在我公司使用的许多此类实现,因为我写了它们:

public int CompareTo(Student other)
{
  return this.Grade - student.Grade;
}

答案 1 :(得分:4)

这里有两件事要考虑。

  1. 记录的内容
  2. 实施什么
  3. 实际的实现当前可能总是返回-1,0或1,而不是其他任何东西。请注意,我还没有验证这一点。

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

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

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

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

答案 2 :(得分:2)

如果您要查看[{1}},CompareTo等类型的Byte实施,您会看到

Int16

public int CompareTo(short value) { return (this - value); } Int32比较未实现相同方式。更新:因为@ O.R.Mapper注意到,因为算术溢出。

答案 3 :(得分:1)

据我了解,有很多(特别是用户定义的)。 MSDN是非特定的,因为你不应该依赖它,只要它是有效的,CompareTo产生的值并不重要。例如,通过减去它们来比较两个int是最快的。

一个真实的例子,这个程序打印88

static void Main(string[] args)
{
    Int16 a = 100;
    Int16 b = 12;
    Console.WriteLine(a.CompareTo(b));
}

在做这个小调查时,我发现一开始看起来有点奇怪。 Int16short)使用此方法,但Int32int)不会,并返回-101。这可能是因为我们正在使用小于返回类型(Int32)的整数,其中最小值减去最大值将适合。