Кодовите договори не проверяват нулевите условия. Защо?

Защо Contracts for .NET не се оплаква от този код?

private static User GetUser()
{
    var sFirstName = Console.ReadLine();
    var sLastName = Console.ReadLine();
    if (sLastName == "NULL")
    {
        return null;
    }
    else
    {
        return new User(sLastName, sFirstName);
    }
}
public static int Main(string[] args)
{
        var oUser = GetUser();
        DisplayUser(oUser);
        Console.ReadLine();
        return 0;
}
private static void DisplayUser(User user)
{
    Contract.Requires(user != null);
    Console.WriteLine(user.ToString());
}

GetUser може да върне null, но договорът никога не казва, че трябва да проверя върнатата стойност, преди да я предам на DisplayUser. Защо?


Автоматичен отговор: Има ниво на предупреждение в конфигурацията на Code Contracts. Трябваше да го поставя от ниско на високо.


person user1485585    schedule 27.06.2012    source източник
comment
Вероятно защото не е нула. Опитайте вместо това да проверите if(sLastName.IsNullOrEmpty()).   -  person    schedule 27.06.2012
comment
@0A0D - ако въведете низа NULL, вие ще получите върната стойност null.   -  person Hans Kesting    schedule 27.06.2012
comment
@HansKesting: А, пропуснах това.   -  person    schedule 27.06.2012


Отговори (1)


Според тази страница на msdn договорите ще не се прилага, ако нямате инсталиран правилния плъгин във Visual Studio. Инсталирал ли си този плъгин?

Трябва да инсталирате добавка Visual Studio, за да наложите договори. Добавката Code Contracts Premium Edition ви позволява да укажете статична проверка и проверка по време на изпълнение на договори за код на страницата със свойства на проекта. Ако не активирате проверка по време на изпълнение, договори като метода Contract.Ensures няма да хвърлят изключения по време на изпълнение, ако договор е нарушен. Добавката Visual Studio не се доставя с Visual Studio 2010 или Windows SDK.

person Øyvind Bråthen    schedule 27.06.2012
comment
Инсталирах го. Слагам отметка в квадратчето Извършване на статична проверка на договора. Ако заменя GetUser с private static User GetUser() { return null; } Договорите ще се оплакват. - person user1485585; 27.06.2012