Контракты Кодекса: как подавить это «требует недоказанных» предупреждение? - PullRequest
1 голос
/ 10 ноября 2011

У меня есть фрагмент кода, для которого cccheck говорит мне, что Requires() недоказан, и что я должен добавить !string.IsNullOrWhitespace(...). Это условие уже проверено, так как я вызываю свой собственный метод расширения, который я написал во времена .Net 3.5:

public static bool IsEmpty(this string s)
{
    if (s == null) return true;
    if (s.Length == 0) return true;
    for (int i = 0; i < s.Length; i++)
        if (!char.IsWhitespace(s[i]))
            return false;
    return true;
}

public static bool IsNotEmpty(this string s)
{
    return !IsEmpty(s);
}

Мой код уже требует, чтобы value было IsNotEmpty:

Contract.Requires(value.IsNotEmpty(), "The parameter 'value' cannot be null or empty.");

Как я могу сказать cccheck (и остальной части платформы Code Contracts), что IsNotEmpty() уже проверяет !string.IsNullOrWhitespace(...)?

1 Ответ

3 голосов
/ 10 ноября 2011

Попробуйте Contract.Ensures(Contract.Result() == !string.IsNullOrWhitespace(s))

РЕДАКТИРОВАТЬ:

Да, я понял, что это приведет к "бездоказательности", когда я опубликовал его, и я надеялся найти время, чтобы ответить более тщательно.Один (несколько тривиальный) способ исправить это, если вы можете стоять, выбрасывая старый код:

public static bool IsEmpty(this string s) 
{ 
    Contract.Ensures(Contract.Result() == string.IsNullOrWhitespace(s))
    return string.IsNullOrWhitespace(s);
} 

public static bool IsNotEmpty(this string s) 
{ 
    Contract.Ensures(Contract.Result() == !string.IsNullOrWhitespace(s))
    return !string.IsNullOrWhitespace(s);
} 
...