Подтвердить что ты не робот

С#: кодовые контракты против обычной проверки параметров

рассмотрим следующие две части кода:

    public static Time Parse(string value)
    {
        string regXExpres = 
           "^([0-9]|[0-1][0-9]|2[0-3]):([0-9]|[0-5][0-9])$|^24:(0|00)$";
        Contract.Requires(value != null);
        Contract.Requires(new Regex(regXExpres).IsMatch(value));
        string[] tokens = value.Split(':');
        int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
        int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
        return new Time(hour, minute);
    }

и

    public static Time Parse(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        string[] tokens = value.Split(':');
        if (tokens.Length != 2)
        {
            throw new FormatException("value must be h:m");
        }
        int hour = Convert.ToInt32(tokens[0], CultureInfo.InvariantCulture);
        if (!(0 <= hour && hour <= 24))
        {
            throw new FormatException("hour must be between 0 and 24");
        }
        int minute = Convert.ToInt32(tokens[1], CultureInfo.InvariantCulture);
        if (!(0 <= minute && minute <= 59))
        {
            throw new FormatException("minute must be between 0 and 59");
        }
        return new Time(hour, minute);
    }

Я лично предпочитаю первую версию, потому что код намного яснее и меньше, а Контракты можно легко отключить. Но недостатком является то, что Visual Studio Code Analysis винит, что я должен проверить значение параметра для null, а контракты конструктора не понимают, что регулярное выражение гарантирует, что минуты и час находятся в пределах заданных границ.

Итак, у меня появилось много неправильных предупреждений, и я не вижу возможности проверять строковые значения с контрактами, не заканчивая throwingExceptionException, кроме проверки RegEx.

Любые предложения о том, как вы могли бы решить эту и эквивалентные ситуации, используя контракты с кодом?

4b9b3361

Ответ 1

Чтобы избавиться от предупреждений, вы можете использовать Contract.Assume