有没有办法在c#中注释允许的值?

时间:2012-11-16 07:19:48

标签: c# parameters restriction

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

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

对于泛型,有一些类似于限制的“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,... ) 

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

5 个答案:

答案 0 :(得分:1)

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

来自msdn

  

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

     

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

     

代码合同的好处包括:

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

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

  •   
  • 静态验证:静态检查程序可以在不运行程序的情况下决定是否存在任何合同违规。它检查   对于隐式契约,例如null解除引用和数组边界,   和明确的合同。

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

  •   

答案 1 :(得分:1)

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

答案 2 :(得分:0)

不,因为编译器应该如何知道值是否为空?您最接近的是code contracts

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您使用的是ReSharper,则可以使用Code Analysis Annotations修饰您的方法并返回值,特别是使用合同注释进行值和可空性分析。