C# 有没有一种方法可以在c中注释允许的值#

C# 有没有一种方法可以在c中注释允许的值#,c#,parameters,restriction,C#,Parameters,Restriction,我经常使用只需要填充参数作为输入的方法。如果有人调用该方法,并且参数不正确,则应抛出错误 有没有一种方法可以注释一个方法:只允许某些值范围,或者它们不应该为null 对于泛型,有一些类似于限制的“where”子句(这些限制到目前为止还没有值) 所以我想做而不是 private static void DoSomething(string string_in, object object_in,... ) { if (null == object_in) throw new NullRe

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

有没有一种方法可以注释一个方法:只允许某些值范围,或者它们不应该为null

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

或者(我最喜欢的)


简言之,有没有更好的方法将调用的类型限制为一定数量的值,然后反复手动进行比较?

没有,因为编译器应该如何知道值是否为null?您可以得到的最接近的属性是

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

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

发件人:

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

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

代码合同的好处包括:

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

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

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

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


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

如果您正在使用,您可以使用特别是用于值和可空性分析的契约注释来修饰您的方法和返回值。

谢谢,看起来很有希望(为什么它是注释而不是答案?)IMHO:编译器可以做两件事:1。静态检查2。为琐碎的检查创建源代码方法的文档没有帮助。总会有人误用它。谢谢,这就是我要搜索的(不知道这个词搜索起来很复杂)谢谢,在快速浏览了一下企业库之后,似乎是为了输入字段,我搜索的主要是界面。(另外,艾尔看起来很有趣)
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,... )