3

使用代码合同时,我收到警告:

在方法合同中检测到对方法“System.Int32.TryParse(System.String,System.Int32@)”的调用没有 [Pure]

具有在接口上定义的接口和代码协定的类,如下面的代码。问题是如何检查字符串是否orgNumberWithoutControlDigit可以转换为有效整数,因为它是模数工作的先决条件?

public string getControlDigit(string orgNumberWithoutControlDigit)
    {
        List<int> orgNumberNumbers = this.getNumberList(orgNumberWithoutControlDigit);

        List<int> productList = orgNumberNumbers.Zip(this.weightNumberList, (first, second) => first * second).ToList();

        int modular = productList.Sum() % 11;

        string controlDigit = getControlDigit(modular);

        return controlDigit;
    }

private static string getControlDigit(int modular)
    {
        string controlDigit;


        if (modular == 0)
        {
            controlDigit = "0";
        }
        else if (modular == 1)
        {
            controlDigit = "-";
        }
        else
        {
            int result = 11 - modular;
            controlDigit = result.ToString();
        }


        return controlDigit;
    }

[ContractClass(typeof(CalculateOrgNumberControlDigitBusinessContract))]
public interface ICalculateOrgNumberControlDigitBusiness
{
    string getControlDigit(string orgNumberWithoutControlDigit);
}


[ContractClassFor(typeof(ICalculateOrgNumberControlDigitBusiness))]
public abstract class CalculateOrgNumberControlDigitBusinessContract:ICalculateOrgNumberControlDigitBusiness
{
    public string getControlDigit(string orgNumberWithoutControlDigit)
    {
        Contract.Requires(orgNumberWithoutControlDigit.Length == 8);
        int parseResult;
        Contract.Requires(int.TryParse(orgNumberWithoutControlDigit, out parseResult));
        Contract.Ensures(parseResult >= 0);
        var result = Contract.Result<string>();
        Contract.Ensures(result != null && result.Length == 1);

        return default(string);
    }
}
4

2 回答 2

1

我了解您想要实现的目标,但我想说将 orgNumberWithoutControlDigit 作为字符串传递给 getControlDigit [sic] 是真正的罪魁祸首。

即使您可以使您的合同生效 - 调用者也必须将字符串转换为 int 才能满足您的合同。现在,如果调用者已经将该转换转换为 int,为什么不让它传递该 int 呢?

我是 Code Contracts 的忠实拥护者,并且在我的大多数项目中都使用它,而且我了解到它不是灵丹妙药。因此,如果您必须有一个字符串参数,请完全删除合同,并在使用前确保您的字符串格式有效。

也许 OrgNumberValidator 助手会比依赖合同更好的选择?

编辑:实际上,我建议创建一个 OrgNumber 类来处理它们。

于 2013-01-02T10:31:41.460 回答
1

您可以创建一个纯辅助方法,而不是int.TryParse直接调用:

[Pure]
private static bool IsInt(string s)
{
    int n;
    return int.TryParse(s, out n);
}

您可以更进一步并将其包装TryParse在一个try块中,false如果抛出任何类型的异常,则返回(只是为了安全起见)。

但是,我倾向于同意 Michael 的观点,即如果可以的话,最好避免传递代表整数的字符串。

于 2013-01-02T11:13:08.743 回答