Проверка составного нуля с ненулевым параметром - PullRequest
1 голос
/ 15 января 2020

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

После рассмотрения я опубликую скриншот вопрос, а не сгущать проблему на тот случай, если я абстрагирую любую подходящую информацию к рассматриваемому вопросу.

enter image description here

У меня есть проблема в том, что они дают ответ как B, тогда как я думаю, что это должен быть A по следующим причинам.

Предложение where в запросе LINQ имеет два критерия, которые оно должно сравнивать с одним, где годы совпадают в DateTime? объект и параметр метода.

Тем не менее, меня больше интересует, почему они считают, что необходима нулевая проверка из-за того, что тип параметра является ненулевым int. Отмена назначения и попытка присвоить значение NULL до передачи параметра по значению приведет к ошибке компилятора.

Если параметр года никогда не может быть нулевым, совпадение с датой DateTime никогда не будет, что делает проверку на ноль лишней.

Я могу понять, почему B также даст ожидаемые результаты, но есть ли что-нибудь неправильно с ответом A.

(PS Я прочитал - Сравнение не nullable от `int` до` null` (LINQ) , что, похоже, подтверждает мою теорию, я просто кричу sh о несогласии с эталонным материалом)

Ответы [ 2 ]

1 голос
/ 15 января 2020

Предположим, вы выбрали A, если Дата равна нулю, вы получите следующее исключение

Nullable object must have a value.
  + System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource)
  + Nullable<T>.get_Value()

, например,

DateTime? dt = null;
 if (dt.Value.Year == 2010) Console.WriteLine("Accepted Value");

Give Error

0 голосов
/ 15 января 2020

Приложение должно соответствовать следующим требованиям:

  • Возврат только тех заказов, у которых значение OrderDate отличается от нуля.
  • Возврат только заказов которые были помещены в год, указанный в параметре year

Кроме того, строка 1, кажется, показывает вам определение OrderDate

public DateTime? OrderDate;

Вопрос говорит вам что OrderDate является обнуляемым DateTime объектом, и вам нужно проверить, что он имеет значение.

Редактировать: Я попробовал это для себя, используя SQLEXPRESS и LINQPad 5, и теперь я вижу, что ответ A работает в контексте LINQ для SQL, поскольку он преобразуется в

WHERE DATEPART(Year,OrderDate) = @year

, и это отфильтровывает нулевые значения OrderDates.

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

Ответ A во всех других C# контекстах вызовет InvalidOperationException «Обнуляемый объект должен иметь значение», и это просто работает в этом контексте, потому что Это LINQ to SQL.

Ответ B будет работать как в контексте C#, так и в контексте LINQ to SQL, поэтому из двух возможных ответов он является самым безопасным и будет помочь вам избежать использования ответа типа А в контексте, когда он не получится. Кроме того, я считаю, что он более четко и недвусмысленно сообщает о том, что вы хотите отфильтровать нулевые даты заказа. При дополнительной проверке нулевого значения может произойти незначительное снижение производительности, но если не будет проблемы с измеримой производительностью, удобочитаемость важнее, чем незначительные улучшения производительности. Если бы я использовал ответ A, я бы включил множество комментариев, описывающих поведение LINQ to SQL, объясняющих, почему проверка на ноль не нужна.

...