2013-06-10 2 views
11

Что нужно вернуть в методе CompareTo, если данный объект null?Override CompareTo: Что делать с нулевым случаем?

MSDN Library показан пример, где возвращается 1. Но я бы предпочел выбросить ошибку, потому что по сравнению с null невозможно.

Я ожидаю от этого мнения разных мнений. Каким может быть подход с лучшей практикой?

+1

Что значит «невозможно»? Все ссылочные типы можно сравнить с нулевым значением. В противном случае вы можете обернуть вещи с помощью [Nullable class] (http://msdn.microsoft.com/en-us/library/system.nullable.aspx). – Renan

+0

Если вы «ожидаете разные мнения», то это не подходит для переполнения стека, так как в FAQ часто указывается, что вам следует «избегать вопросов субъективных вопросов». –

+1

приведен пример. Поскольку CompareTo возвращает порядок сортировки объектов, не обязательно классифицировать нуль в качестве первого элемента – NoviceProgrammer

ответ

22

Да, есть лучшая практика. Вопреки тому, что говорят другие ответы, существует ожидаемый стандарт, а не просто самое популярное поведение.

Правильный ответ дается в документации MSDN для IComparable<T>.CompareTo и IComparable.CompareTo:

По определению, любой объект сравнивает больше нуль и два нуль ссылки сравнения равны друг другу.

(По контракту, сравнивая больше определяется как:., Если a > b затем a.CompareTo(b) > 0)

Это ожидаемое поведение также подтверждается, например, в Nullable.Compare<T>. Нуль всегда сравнивается как меньшее значение.

Стоит также отметить, что для необщего сравнения, не соответствующие типы не должны рассматриваться как нуль:

Параметр, OBJ, должен быть того же типа, класса или значение типа который реализует этот интерфейс; в противном случае ArgumentException - .


Это не влияет на ваш вопрос, но имейте в виду, Nullable<T> comparison operators (==, !=, <, <=, >, >=) не следуют IComparable конвенции.

При выполнении сравнения с обнуляемыми типами, если значение одного из обнуляемых типов равен нуль, а другие нет, все сравнения оценки в false для != (не равно), за исключением. Важно, чтобы предполагал, что, поскольку конкретное сравнение возвращает false, напротив случая возвращает true. В следующем примере 10 не является больше, чем или равно нулю. Только num1 != num2 - true.

Существует также нечетный результат, который (int?)null == (int?)null оценивается как истина, но (int?)null <= (int?)null не делает.

2

Выбор за вами. Не исключено, что вы можете представить себе действительный прецедент, где я бы ничего не сравнивал, и хочу, чтобы «что-то» считалось большим. Но именно поэтому вы переопределяете его, поэтому вы можете решить, как вы хотите справиться с этим делом.

1

Лучшая практика будет зависеть от вашего конкретного случая: по сравнению с null может быть возможно в зависимости от объекта, который вы сравниваете.

Если я определяю свой объект таким образом, чтобы null - это минимально возможное значение для любого сравнения, то, по сравнению с null, очевидно, возможен и имеет четко определенный результат. В других случаях бросание исключения может иметь больше смысла.

В конечном счете, это (довольно субъективный) вопрос дизайна, на который не обязательно должен быть один ответ.

-1

CompareTo с аргументом null влияет на случай сортировки списка с нулевыми элементами. Возвращая 1, когда данный объект имеет значение null, значение null появляется в верхней части списка при сортировке, что является самым популярным поведением.