如何避免重复使用代码合同检查?

3

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

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检查?

你能否考虑在方法中使用泛型? - Suresh Kumar Veluswamy
我不能在这些方法中使用泛型。 - Vlad
1
我个人认为这种特定的重复是一种巧合,因此我会将其保留(这样,方法就是独立的:每个方法都有自己的检查,如果它们相同,那就没关系了)。 - Alex
1个回答

4

您可以使用合同缩写器。但个人认为对于这种简单的检查,我不会使用它。以下是我们使用的一个缩写器示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接