强制C#方法只传递正参数?

时间:2015-02-24 15:14:27

标签: c# .net oop

我想强制我的方法只接受一个整数参数,如果它是正面。如果方法传递否定整数,则应该抛出编译时错误。实现这一目标的最佳方法是什么?

目前我在方法中使用Math.Abs(Int),但我希望错误发生在编译时。

2 个答案:

答案 0 :(得分:15)

只需将参数设为uintushort即可。这将防止编译时的负面输入。它不会阻止0,但是......我假设你真的是在非负输入而不是严格正输入之后。

如果你的方法接受签名参数,那么:

  • 您可以验证参数值,如果它无效则抛出异常。 (这比使用Math.Abs尝试“修复”无效输入更好。
  • 您可以使用Code Contracts向其他代码指示参数应该具有非负值,并且它将尝试证明您调用该方法的所有位置,该值将为非负值。这不会由C#编译器强制执行,但它仍然可以是构建时过程。

如果您使用异常方法,那么您还应该围绕调用方法的代码进行全面的单元测试 - 当然,该代码也应验证输入。< / p>

答案 1 :(得分:1)

您可以使用Code Contracts(和link)并在编译之前进行静态代码分析,然后使用:

Contract.Requires( parameter >= 0 );

静态代码分析是有限的,您不应该限制代码契约(您仍然应该抛出运行时异常)。它会捕获明显的东西(比如传递常量),但是当它们来自代码外部时(从磁盘读取,从数据库中读取或其他任何东西),它们不会捕获负值。

这在编译时是不可能的