c# .net .net-4.0 code-contracts microsoft-contracts

C#: Contratos de código vs. validación de parámetros normales



.net .net-4.0 (1)

Para deshacerse de las advertencias, puede usar Contract.Assume

considere las siguientes dos piezas de código:

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

y

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

Personalmente prefiero la primera versión porque el código es mucho más claro y más pequeño, y los contratos se pueden desactivar fácilmente. Pero la desventaja es que Visual Studio Code Analysis culpa de que debería verificar el valor del parámetro para null y los contratos del constructor no se dan cuenta de que la expresión regular asegura que el minuto y la hora están dentro de los límites establecidos.

Así que termino teniendo muchas advertencias erróneas y no veo ninguna forma de validar valores de cadena con contratos sin terminar arrojando FormatExceptions que no sea una validación de RegEx.

¿Alguna sugerencia de cómo resolvería esto y situaciones equivalentes utilizando los contratos del Código?