4

我做了一个这样的方法

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 被标记为潜在的问题。

编辑 我刚刚修改了代码并添加了调用代码和预期的行为。我还添加了一个可能在 GetPerson 方法上不存在的属性

4

2 回答 2

2

Code Contract 不提供这样的功能,C# 也不提供

代码契约只要求调用者在被调用方法开始时遵守某些约束。这些就是所谓的前提条件后置条件是被调用者的职责,它定义了被调用方法退出时程序的状态。

契约式设计是定义这些职责的一种方式,而不是告诉调用者他们应该如何处理由被调用方法引起的某些情况。

于 2011-06-08T13:56:03.297 回答
1

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

如果你在调用代码中启用了 Code Contracts,验证者会认为返回的GetPerson()可以为 null。所以:

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
}

而且,与问题完全无关,如果 people 是(如)字典,这通常会更有效:

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

   this.persons.TryGetValue(personId, out p);
   return p;
}
于 2011-06-08T21:42:57.343 回答