Использование .Equals для константы, чтобы избежать (сохранить) нулевую проверку - PullRequest
1 голос
/ 14 сентября 2011

Так вот стандартный код для IValueConverter

{
 if (value == null)
  return null;

 if (value.Equals(true))
  return Colors.Red;

 return null;
}

И еще один способ:

{
 if (true.Equals(value))
  return Colors.Red;

 return null;
}

Итак, используя true.Equals (), мы сохраняем нулевую проверку. Каков общий подход и передовые практики в отношении использования проверок типа true.Equals () или «Hello» .Equals ()?

P. S. Мой вопрос: каково ваше / общее мнение по этому поводу: плохо / хаки или хорошо / хорошо?

Ответы [ 4 ]

1 голос
/ 14 сентября 2011

Метод .Equals, как правило, проверяет нулевое значение в любом случае, но если вы пытаетесь оптимизировать свой код, удаляя единственную нулевую проверку, вы действительно пропускаете отметку.Это не будет иметь никакого значения практически в любом приложении.

0 голосов
/ 31 августа 2014

Вы можете избежать NullReferenceException и "забавных" вызовов, таких как true.Equals(value), используя статический метод Object.Equals.Поскольку метод реализован с помощью Object, он доступен во всех методах и будет выполнять для вас необходимые нулевые проверки:

return Equals(value, true) ? (Object) Color.Red : null;

или, если вам не нравится троичный оператор:

if (Equals(value, true))
  return Color.Red;
return null;
0 голосов
/ 29 сентября 2011

Прежде всего, вам, вероятно, следует использовать базовый универсальный класс для конвертеров, который имеет строго типизированный метод virtual, и в этом случае вы не имеете дело с object, а вместо этого с bool внутри конвертера. код.

Если мы застряли со значением объекта, я защищаю читаемый и поддерживаемый код и короткие функции, которые заменяют if, которые могут стать неясными в будущем.

Так что я могу использовать что-то вроде

{
 if(IsValueBoolAndTrue(value){
    return ErrorColor;
 }
 else {
    return DefaultColor;
 }
}

Color.Red и null являются константами, которые также делают их намерение неясным. Также определение этих двух констант может помочь в обратном преобразовании во втором методе IValueConverter

Хотя метод IsValueBoolAndTrue технически делает то же самое, что и true.Equals(value) (внутри себя он может вызвать это на самом деле), наличие специального метода поможет человеку, который смотрит на это в будущем, не выполнять «рефакторинг», который нарушит код, потому что он будет смотреть на true.Equals(value) без комментариев и думать, что он на самом деле не является чем-то подходящим, или будет думать, что его не элегантный код, и рефакторинг его, не оставляя его функциональность одинаковой.

0 голосов
/ 14 сентября 2011

У меня есть сильное предпочтение более короткому коду (и под этим я подразумеваю меньше токенов, не используя недопустимых коротких идентификаторов) - он часто более читабелен и понятен, менее подвержен ошибкам и дает меньше кода для обслуживания.

Таким образом, оставив нулевой чек для .Equals с помощью true.Equals - явный выигрыш в моей книге.

В этом конкретном примере вы даже можете удалить дубликат возврата и сделать

return true.Equals(value) ? Colors.RedColors.Red : null;

но некоторые могут найти это менее читабельным, чем оператор if.

...