【问题标题】:How to not duplicate Code Contracts checks?如何不重复代码合同检查?
【发布时间】:2014-03-25 08:12:49
【问题描述】:

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

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

【问题讨论】:

  • 看看你是否可以为你的方法使用泛型?
  • 我不能在这个方法中使用泛型。
  • 我个人认为这种特定的重复是巧合并保留它(因为这样,方法是独立的:对每个自己的检查,如果它们相同,哦)

标签: c# code-contracts


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多