【发布时间】:2011-09-30 08:11:48
【问题描述】:
想象一下我有一个有合同的方法:
public void Do(string value)
{
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(value));
MyBusiness.Handle(value);
}
这个方法是从一个 asp.net 2.0 网站调用的,值是从一个文本框中获取的,强制的:
<asp:TextBox ID="txtValue" runat="server" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtValue" ErrorMessage="boom" />
<asp:Button ID="btnDo" OnClick="btnDo_Click" Text="Do" />
后面的代码很经典:
protected void btnDo_Click(object source, EventArgs e)
{
Page.Validate();
if(Page.IsValid)
{
Do(txtDo.Text);
}
}
此代码正在运行,但会引发代码合同警告:Requires unproven (!string.IsNullOrEmpty(value)),这让我认为(尽管并不奇怪)静态检查器不够聪明,无法查看 Page.IsValid(这对于静态检查器拥有这样的智能)。
在这种情况下我有什么选择?
我看到的选项选项是帮助静态检查假设:
protected void btnDo_Click(object source, EventArgs e)
{
Page.Validate();
if(Page.IsValid)
{
Contract.Assume(!string.IsNullOrEmpty(value));
Do(txtDo.Text);
}
}
这具有按预期工作的优点,但是客户端被很多合同所干扰。假设大型项目。
有什么想法/建议吗?
【问题讨论】: