Повторное использование возможного исключения InvalidOperationException

#c# #resharper

#c# #resharper

Вопрос:

 public class BloodPressure {
    public Int16? Diastolic { get; set; }

    private Boolean IsValid {
        get {
            var valid = false;

            if (this.Diastolic.HasValue amp;amp; this.Systolic.HasValue) {
                if ((this.Diastolic.Value >= 0) amp;amp; (this.Systolic.Value >= 0)) {
                    valid = true;
                }
            }

            return (valid);
        }
    }

    public Int16? Systolic { get; set; }

    public override String ToString() {
        var result = "";

        if (this.IsValid) {
            result = this.Systolic.Value.ToString("0")   "/"   this.Diastolic.Value.ToString("0");
        }
        else {
            result = null;
        }

        return (result);
    }
}
  

Это строка, на которую жалуется ReSharper:

 result = this.Systolic.Value.ToString("0")   "/"   this.Diastolic.Value.ToString("0");
  

Поскольку я заранее вызываю свою логику проверки, я могу быть уверен, что и систолическое, и диастолическое значение будут иметь значения, которые я могу использовать. Решарпер этого не видит, или он жалуется на что-то другое?

Интересно, что у него нет проблем с этим разделом:

 if ((this.Diastolic.Value >= 0) amp;amp; (this.Systolic.Value >= 0)) {
    valid = true;
}
  

Комментарии:

1. Часто возникают ситуации, когда перед манипулированием значением вызываются методы проверки, такие как IsNotNull(), isValid(). У Resharper отличная концепция атрибутов аннотаций (т. Е. NotNull). Для Jetbrains было бы хорошей идеей пойти дальше и реализовать такие, как EnsuresNotNull(«ParamName»), EnsuresNotNull(«propertyName»), EnsuresNotNull(«fieldName»), это даст нам возможность избавиться от подобных ошибок

Ответ №1:

Возможности ReSharpers по обнаружению подобных вещей имеют свои границы. ReSharper не распознает, что вызов this.IsValid в принципе эквивалентен this.Diastolic.HasValue amp;amp; this.Systolic.HasValue в отношении этой проблемы, т. е. ReSharper ищет эти проверки только в том же методе / свойстве.

Комментарии:

1. Поскольку некоторые из моих клиентов оценивают нас по количеству проблем с ReSharper, как бы вы посоветовали мне чисто решить это? Я бы хотел сохранить IsValid свойство, чтобы логика проверки в ToString() не была такой неприятной.

2. Сначала убедитесь, что замена IsValid на код внутри IsValid действительно удаляет это предупреждение. Если это так, просто заставьте ReSharper игнорировать это конкретное предупреждение, чтобы больше не возникало проблем с ReSharper 😉 (Оценка кода по количеству проблем ReSharper — это бессмыслица)

3. Перемещение IsValid логики в ToString() фактически избавляет от предупреждения. Основываясь на моем предыдущем утверждении, я, вероятно, просто оставлю это таким образом. Это, конечно, некрасиво.