3

我有相对经常的方法,我只希望填充参数作为输入。如果有人调用该方法,并且参数不正确,则应该抛出错误。

有没有办法注释方法说:只允许某些值范围,或者它们不应该为空?

对于泛型,有类似“where”子句的限制(但没有那么远没有值)。

所以我想做而不是

private static void DoSomething(string string_in, object object_in,... ) 
{
    if (null == object_in) throw new NullReferenceException("Input parameter of object is empty.");
    if (String.IsNullOrEmpty(string )) throw new NullReferenceException("Input parameter string  is empty.");

就像是

private static void DoSomething(string string_in, object object_in,... ) 
    where string _in:!String.IsNullOrEmpty(string_in)
    where object_in : object_in !=null

或者

private static void DoSomething(string string_in != null, object object_in != null,... ) 

或(我最想要的)

[Restriction string_in: value != null, value != empty]
[Restriction object_in: value != null]
[Restriction int_in: value inRange 3..9]
private static void DoSomething(string string _in, object object_in,... ) 

所以简而言之,有没有更好的方法将调用类型限制为一定数量的值,然后只需手动一遍又一遍地比较某些东西?

4

5 回答 5

1

代码合约为您的代码提供静态分析,因此它非常接近您的需求。作为奖励,您还可以启用运行时检查。

来自msdn

代码契约提供了一种在代码中指定前置条件、后置条件和对象不变量的方法。前提条件是输入方法或属性时必须满足的要求。后置条件描述了方法或属性代码退出时的期望。对象不变量描述了处于良好状态的类的预期状态。

代码契约包括用于标记代码的类、用于编译时分析的静态分析器运行时分析器。代码契约的类可以在 System.Diagnostics.Contracts 命名空间中找到。

代码合约的好处包括:

  • 改进的测试:代码合约提供静态合约验证、运行时检查和文档生成。

  • 自动测试工具:您可以使用代码契约通过过滤掉不满足前提条件的无意义测试参数来生成更有意义的单元测试。

  • 静态验证:静态检查器可以在不运行程序的情况下判断是否存在合同违规。它检查隐式契约,例如空解引用和数组边界,以及显式契约。

  • 参考文档:文档生成器使用合同信息扩充现有 XML 文档文件。还有一些样式表可以与 Sandcastle 一起使用,以便生成的文档页面具有合同部分。

于 2012-11-16T09:00:05.627 回答
1

您可以使用 Enterprise Library 5.0 中的验证应用程序块。

于 2012-11-16T09:00:29.993 回答
0

不,因为编译器应该如何知道一个值是否为空?您可以获得的最接近的是代码合同

于 2012-11-16T07:21:42.763 回答
0

不,您需要记录您的方法并在其中添加信息,或者您可以实现自定义属性但没有编译器会强制执行。另外,不要抛出NullReferenceException. 抛出一个ArgumentNullExceptionArgumentException。正如一些人所说,代码合同可能会提供类似的东西。

于 2012-11-16T07:23:36.707 回答
0

如果您使用ReSharper ,您可以使用代码分析注释来装饰您的方法并返回值,尤其是使用合同注释进行值和可空性分析。

于 2016-02-17T14:54:52.270 回答