Кодовые контракты в C # 4.0 - PullRequest
4 голосов
/ 08 июня 2011

Я сделал такой метод

class PersonCollection
{
  [Contracts.CanReturnNull]  //dont know if something like this exists?
  IPerson GetPerson(Guid personId)
  {
       if (this.persons.Contains(personId))
            return this.persons[personId];
       else
            return null;
  }
}

Теперь вызывающий код должен правильно обрабатывать нулевое значение. Есть ли способ выразить контракт для всех вызывающих абонентов, чтобы они могли обрабатывать нулевое значение, возвращаемое этим методом?

PersonCollection pc = new PersonCollection();
IPerson p = pc.GetPerson(anyId);
p.Name = "Hugo";  // here I want to have a curly line

Я хочу, чтобы буква p была помечена как потенциально проблемная.

EDIT Я просто изменил код и добавил вызывающий код и исключенное поведение. Также я добавил атрибут, который, вероятно, не существует в методе GetPerson

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Код контракта не предоставляет такую ​​функцию, как и C #

Code Contracts требует от вызывающего только соблюдения определенных ограничений при start вызываемого метода. Это так называемые предварительные условия . Постусловия являются обязанностью вызываемого и определяют, какое состояние программы будет при выходе вызванного метода.

Проектирование по контракту - это способ определить эти обязанности, а не сообщать вызывающим абонентам, как они должны справляться с определенными условиями, вызванными вызываемым методом.

1 голос
/ 09 июня 2011

То, что вы хотите (после прочтения комментариев), произойдет по умолчанию:

Если вы включите кодовые контракты в вызывающем коде, верификатор посчитает, что возвращение GetPerson() может быть нулевым.Итак:

IPerson GetPerson(Guid personId)
{
   // no pre/post conditions
}

void PrintPerson(IPerson p)
{
   Contract.Requires(p != null);
   ...
}

void Foo()
{
     var p = GetPerson(id);
     PrintPerson(p);    // a warning here: can not verify p != null
}

И, совершенно не имеющий отношения к вопросу, это обычно будет более эффективным, если люди (как) словарь:

IPerson GetPerson(Guid personId)
{
   Person p = null;

   this.persons.TryGetValue(personId, out p);
   return p;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...