我有静态类,其中包含具有相同签名的方法。
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检查?
答案 0 :(得分: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
作为失败的条件,这对于参数异常没有任何意义。
Abbreviators通常作为检查类状态的实例方法更有意义。例如(来自MSDN):
[ContractAbbreviator]
private void DataAndStateUnchanged()
{
Contract.Ensures(this.State == Contract.OldValue(this.State));
Contract.Ensures(this.Data == Contract.OldValue(this.Data));
}