C #: contratos de código vs. validação de parâmetro normal

considere os seguintes dois códigos:

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); } 

e

  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); } 

Eu pessoalmente prefiro a primeira versão porque o código é muito mais claro e menor, e os contratos podem ser facilmente desativados. Mas a desvantagem é que o Visual Studio Code Analysis culpa que eu deveria verificar o valor do parâmetro para null e os Contratos do construtor não percebem que o regex garante que o minuto e a hora estejam dentro dos limites especificados.

Então eu acabo tendo muitos avisos errados e não vejo como validar valores de string com contratos sem acabar jogando FormatExceptions diferente de uma validação RegEx.

Alguma sugestão de como você resolveria isso e situações equivalentes usando contratos de código?

Para se livrar dos avisos, você pode usar Contract.Assume