??или .GetValueOrDefault () - PullRequest
       25

??или .GetValueOrDefault ()

2 голосов
/ 04 июня 2019

У меня есть свойства типа int? и decimal?, которые используются в расчете.Если значение любого из них равно нулю, оно по умолчанию равно 0. Я пытаюсь выбрать между использованием null-coalescing или GetValueOrDefault(), который также будет по умолчанию равен 0, если значение равно null.Какой подход будет лучше с точки зрения читабельности и производительности (если есть какие-либо заметные различия)?

Первый:

public decimal MyMethod(int memberId)
{ 
    var dto = GetDtoValue(memberId);
 return (dto.PropertyOne ?? 0)
      + (dto.PropertyTwo ?? 0)
      + (dto.PropertyThree ?? 0)
      - (dto.PropertyFour ?? 0)
      + ...
}

Второй:

public decimal MyMethod(int memberId)
    { 
        var dto = GetDtoValue(memberId);
     return dto.PropertyOne.GetValueOrDefault())
          + dto.PropertyTwo.GetValueOrDefault())
          + dto.PropertyThree.GetValueOrDefault())
          - dto.PropertyFour.GetValueOrDefault())
          + ...
    }

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

читаемость

Это мнение конечно, но

  • Я читаю ?? 0 и чувствую, что все сразу ясно
  • Я прочитал GetValueOrDefault и мне нужно секунду, чтобы подумать о типе, а затем о значении этого типа по умолчанию (и я не вижу в этом проблемы, просто указываю на «ментальное отображение»)

Производительность

Этот источник предполагает, что GetValueOrDefault быстрее, но только в контексте микрооптимизации - так что в большинстве случаев читаемость должна быть приоритетной.

  • если интересно, этот источник также показывает CIL
1 голос
/ 04 июня 2019

Для чего стоит

?? (null coalesce) внутри этой ситуации вызовет GetValueOrDefault

Разница в производительности будет незначительной (если у вас нет проблем с производительностью),так что все, что осталось, это выяснить, каким образом вы считаете более читабельным

Проверьте это здесь

...