Лучше DateTime? или использовать значение по умолчанию (DateTime) для NULL? - PullRequest
13 голосов
/ 27 января 2011

Я разрабатываю веб-сайт на C # / NHibernate с системой личных сообщений. Я хотел бы, чтобы администраторы проверяли, было ли когда-либо прочитано сообщение пользователем, и вместе выделяли те сообщения, которые еще не были прочитаны пользователями. Для достижения обоих я нашел два варианта:

Вариант 1

class Message
{
    DateTime? Read;
}

где Read==null означает еще не прочитано

Вариант 2

class Message
{
    DateTime Read;
}

где Read==default(DateTime) (1 января, 1:00, 0:00:00) означает, что еще не прочитано.

В университете меня учили использовать значение NULL для обработки всех специальных случаев, а также использование типа Nullable кажется хорошим выбором, поскольку оно выглядит проще для запроса непрочитанных сообщений, проверяя, являются ли они NULL или нет.

Но использование обнуляемых типов, по крайней мере, включает в себя упаковку и распаковку в коде с понижением производительности. С другой стороны, запрос непрочитанных сообщений означает сравнение значения (но оно может быть проиндексировано)

Мой вопрос

Какой вы предлагаете подход для этого? Что бы лучшие практики предложили в этом случае?

Ответы [ 6 ]

17 голосов
/ 27 января 2011

Используйте DateTime?. Его конкретное назначение - избегать использования зарезервированных значений («магические числа») для представления особых случаев, таких как null.

Кроме того, использование обнуляемого типа не вводит сам бокс. Любые значения, которые были бы помещены в коробку, все еще будут, но вы не будете вводить бокс просто переключаясь. Тип Nullable<T> на самом деле является структурой, а возможность сравнения с null (или Nothing в VB.NET) является строго языковым соглашением. Под прикрытием он переводится в проверку свойства HasValue.

7 голосов
/ 27 января 2011

Использование обнуляемых типов существенно не снижает производительность по сравнению с альтернативными подходами.И DateTime, и DateTime? являются структурами, и здесь нет никакого бокса.Использование Nullable - правильный выбор.

3 голосов
/ 27 января 2011

Задайте себе тот же вопрос при работе с числовыми значениями.Я использую 0?Что если 0 имеет реальное значение?NULL - это отсутствие значения.В 99 случаях из 100 следуйте тому, что делает цель кода наиболее очевидной.Что касается производительности, даже если она есть, она будет бледной по сравнению с любыми проблемами с производительностью, которые есть в вашем собственном коде.

0 голосов
/ 27 января 2011

Мне не хватает трюка?

class Message
{
    DateTime LastRead;
    bool Read;
}
0 голосов
/ 27 января 2011

Чтобы вернуться к сказанному Марком, если у вас возникли проблемы с использованием обнуляемого типа в клиентском коде, вы можете установить для него значение DateTime.MinValue, а затем на уровне бизнеса переключиться на обнуляемое значение.Затем вы можете передать обнуляемый тип в свой DataAccess.Это помогает сохранить уровень абстракции для использования значений nullables.

0 голосов
/ 27 января 2011

Как сказали Марк и Адам, способ, которым можно обнуляться, - путь.Вы не увидите снижения производительности, и это сделает запрос намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...