Посмотрев similar question, мне было интересно, если следующее выражение ...Null-распространения для проверки нулевой предварительного условного оператора
if (attribute != null && attribute.Description == input)
... будет вести себя (почти) идентичны, к следующему нулевому распространения вариант?
if (attribute?.Description == input)
До сих пор я мог определить только после (как-то незначительные) различия:
- не представляется возможным в случае
input
имеет ненулевых типа в случаеinput
- бы сам
null
, поведение будет изменен
Я что-то пропустил? или существуют другие отличия в поведении?
EDIT: в конце концов, только отказоустойчивая альтернатива я нашел для первого фрагмента кода, будет:
if (attribute?.Description?.Equals(input) ?? false)
'attribute' оценивается только один раз во втором случае, поэтому вы никогда не сможете получить' NullReferenceException'. В первом случае, если атрибут 'attribute' изменяется от ненулевого значения до нуля после оценки первого условия, но перед оценкой второго, вы все равно увидите исключение ... –
Если вы не хотите разрешите 'input' быть' null', вы должны сначала проверить это. Тогда нет никакой разницы, потому что значение nullable можно сравнить с не-nullable. –
@TimSchmelter Это на самом деле вам не поможет. Дело в том, что два фрагмента * ведут себя * по-разному, когда 'input' равно null, и они делают это таким образом, что для второго фрагмента вы не можете просто проверить его первым; вам нужно будет реорганизовать второй фрагмент в нечто похожее на первое, чтобы оно вернуло правильный результат, если 'input' разрешено быть« null ». – Servy