Контракты кода в C# 4.0


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

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

Теперь вызывающий код должен правильно обрабатывать значение null. Существует ли способ выразить контракт для всех вызывающих объектов, что они должны быть в состоянии обрабатывать значение 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 4

2 ответа:

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

Если включить в вызывающем коде контракты кода, верификатор будет считать, что возврат 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
}

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

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

   this.persons.TryGetValue(personId, out p);
   return p;
}

Контракт кода не предоставляет такой возможности, как и C#

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

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