如何避免重复代码契约检查

本文关键字:契约 检查 代码 何避免 | 更新日期: 2023-09-27 17:53:28

我有一个静态类,它包含具有相同签名的方法。

static class SomeClass
{
    static void SomeMethod(int param)
    {
        Contract.Requires<ArgumentException>(param != 0);
        // some code
    }
    static void SomeMethod2(int param)
    {
        Contract.Requires<ArgumentException>(param != 0);
        // some code
    }
}

有没有办法在这个方法中不重复CodeContract检查?

如何避免重复代码契约检查

您可以使用合同缩写。但就我个人而言,我不会为了这种简单的检查而这么做。下面是我们使用缩写词的一个例子:

public static class ContractEx
{
    [ContractAbbreviator]
    public static void StringNullOrEmpty(string s, string parameterName)
    {
        Contract.Requires<ArgumentNullException>(s != null, parameterName);
        Contract.Requires<ArgumentException>(s.Length != 0, parameterName);
        Contract.Requires(!String.IsNullOrEmpty(s));  // required for static code analysis
    }
}

用法:

void SomeMethod(string foo)
{
    ContractEx.StringNullOrEmpty(foo, "foo");
}

注意,这有一个明显的缺点,必须自己指定参数名称。您可以省略它,但这样一来,契约重写器就会发出一个以s != null为失败条件的异常,这对于参数异常来说是没有意义的。

缩写符通常作为检查类状态的实例方法更有意义。例如(来自MSDN):

[ContractAbbreviator]
private void DataAndStateUnchanged() 
{
   Contract.Ensures(this.State == Contract.OldValue(this.State));
   Contract.Ensures(this.Data == Contract.OldValue(this.Data));
}