Здесь есть 3 различных сценария, поэтому давайте рассмотрим синтаксис для каждого:
Возврат "NA"
, если либо pr
, либо pr.Value
null:
var _var = pr?.Value ?? "NA";
Оператор ?.
в основном скажет, что «если pr
равно нулю, возвращает нулевое значение для всего выражения и не разыменовывает pr.Value
»
Так что еслиpr
равно нулю, оператор ?.
сделает выражение равным нулю, или, если pr.Value
равно нулю, оно также будет равно нулю, и в обоих случаях ?? "NA"
оценит все это как "NA"
.
Это эквивалентно следующему результату:
string _var;
if (pr is null || pr.Value is null)
_var = "NA";
else
_var = pr.Value;
Возврат "NA"
, если pr.Value
равно нулю:
var _var = pr.Value ?? "NA";
Это то, что у вас есть.Это выдаст NullReferenceException
, если pr
равно нулю, но оценивается как "NA"
, если pr
не равно нулю, но pr.Value
равно нулю.
Это результат, эквивалентный следующему:
string _var;
if (pr.Value is null) // can throw NullReferenceException
_var = "NA";
else
_var = pr.Value;
Возврат "NA"
, если pr
равно нулю и ... что если pr.Value
равно нулю?
Ни ??
, ни ?.
может помочь вам в этом, но вы можете использовать троичный оператор:
var _var = (pr is null)
? "NA"
: pr.Value;
Это будет равно "NA"
, если pr
равно нулю, pr.Value
, если pr
не равно нулю, что будеттаким образом, можно вычислить значение NULL, если pr
не равно NULL, но pr.Value
равно NULL.
Примечание , оператор ??
также вычисляется лениво, как троичный оператор, поэтому, если у вас есть это:
var _v = pr?.Value ?? ComputeTheValue();
, и этот вызов метода дорог, он будет оцениваться только в том случае, если pr?.Value
фактически равен нулю, если pr
не является нулевым, и pr.Value
не является нулевым, вызов не будет выполнен.