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”>它可以工作了,现在我安装的版本没有进行静态检查。谢谢