C#4.0中的代码契约

时间:2011-06-08 11:31:29

标签: c#-4.0 code-contracts design-by-contract

我做了这样的方法

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值。有没有办法为所有调用者表达他们需要能够处理此方法返回的空值的合约?

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

我想要的是p被标记为潜在的问题。

修改 我只是修改了代码并添加了调用代码和被删除的行为。另外,我在方法GetPerson

中添加了一个可能不存在的属性

2 个答案:

答案 0 :(得分:2)

代码合同不提供此类功能,C#

也不提供

代码合同仅要求来电者遵守被叫方法开始的某些约束。这些是所谓的先决条件后置条件是被调用者的责任,并定义被调用方法的程序状态退出

按合同设计是一种定义这些责任的方法,而不是告诉呼叫者他们应该如何处理由被调用方法引起的某些条件。

答案 1 :(得分:1)

默认情况下,您似乎想要的(阅读评论后):

如果在调用代码中启用代码约定,则验证者将认为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;
}