Представьте, что у меня есть метод с контрактом:
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);
}
}
Это имеет смысл для работы, как и ожидалось, но на стороне клиента много шума из контракта. Рассмотрим крупный проект.
Есть идеи / предложения?