использование ??получить атрибуты объекта, если объект не нулевой - PullRequest
0 голосов
/ 23 ноября 2018

Можно ли использовать C # '??'оператор как это:

var _var = pr.Value ?? "NA";

Чтобы проверить, является ли pr нулевым, а не является ли атрибут Value pr нулевым?

Я не нашел ни одного примера, который бы показывал что-то подобное.

Если да, рекомендуется или лучше использовать метод расширения в этом случае?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Здесь есть 3 различных сценария, поэтому давайте рассмотрим синтаксис для каждого:

  1. Возврат "NA", если либо pr, либо pr.Valuenull:

    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;
    
  2. Возврат "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;
    
  3. Возврат "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 не является нулевым, вызов не будет выполнен.

0 голосов
/ 23 ноября 2018

Чтобы проверить, является ли pr нулевым и нет, если атрибут значения pr равен null ?

Похоже, вы хотите проверить толькоесли pr равно нулю.в этом случае вам необходим троичный оператор:

var _var = pr == null ? "NA" : pr.Value;

или используйте простой if / else.

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