2011-09-30 76 views
1

想象一下,我有合同的方法:代码合同和ASP.Net校验

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); 
    } 
} 

此代码工作,但扔代码合同warni这让我觉得(虽然并不奇怪)静态检查器不够聪明,无法看到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

我认为Contract.Assume()在这里是正确的选择。是的,它嘈杂,但我不知道有什么更好的方式,不会使问题复杂化。