Контракты кода в 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 ответа:
То, что вы, кажется, хотите (после прочтения комментариев) произойдет по умолчанию:
Если включить в вызывающем коде контракты кода, верификатор будет считать, что возврат
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#
Контракты кода требуют от вызывающего только соблюдения определенных ограничений в начале вызываемого метода. Это так называемые предпосылки . Постусловия являются ответственностью вызываемого объекта и определяют, каким будет состояние программы на выходе из вызываемого метода.
Проектирование по контракту-это способ определить эти обязанности, а не скажите вызывающим, как они должны обрабатывать определенные условия, вызванные вызываемым методом.