C# 4.0 C#4.0中的代码契约

C# 4.0 C#4.0中的代码契约,c#-4.0,code-contracts,design-by-contract,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

我做了一个这样的方法

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

编辑
我只是修改了代码,添加了调用代码和expcected行为。此外,我还添加了一个属性,该属性可能不存在于方法GetPerson上。代码契约不提供这样的功能,C#

代码契约只要求调用方在被调用方法的开始处遵守某些约束。这些是所谓的先决条件。 后置条件由被调用方负责,并定义被调用方法退出时程序的状态

契约式设计是定义这些责任的一种方式,而不是告诉调用方他们应该如何处理被调用方法引起的某些条件

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

如果在调用代码中启用代码契约,验证者将考虑<代码> GETMIN()/<代码>的返回可以为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
}

而且,与问题完全无关,如果人们(像)一本字典,这通常会更有效率:

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

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

+1:代码契约允许您将“此参数不能为null”作为前置条件,或将“此返回值不会为null”作为后置条件。在C#中,引用类型变量的默认值为null。除非
GetPerson
通过契约确保
IPerson
不为null,否则调用方必须处理
null
返回的可能性。我建议将方法名称更改为GetPersonOrNull,如果你想让调用者明白他可能会得到一个空值,我只是用我预期的行为扩展了我的问题。实际上,我喜欢用类似于属性的东西来标记GetPerson方法,表示调用方需要能够处理空返回值。@schoet,我明白了,关键是不做任何事情就可以得到确切的结果。没有后置条件的GetPerson()已经在说“I can return null”>它可以工作了,现在我安装的版本没有进行静态检查。谢谢