想象一下,我有一个签订合同的方法:
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);
}
}
这样做的优点是可以按预期工作,但客户端会被大量的Contract.Assume大型项目声明。
有任何想法/建议吗?
答案 0 :(得分:0)
我认为Contract.Assume()
是正确的选择。是的,它很吵,但我不知道任何更好的方法,不会使问题复杂化。