我定期验证我的函数参数:
public static void Function(int i, string s) { Debug.Assert(i > 0); Debug.Assert(s != null); Debug.Assert(s.length > 0); }
当然,检查在函数的上下文中是"有效的".
这是常见的行业惯例吗?关于函数参数验证的常见做法是什么?
如果值无效或稍后会导致异常,则接受的做法如下:
if( i < 0 ) throw new ArgumentOutOfRangeException("i", "parameter i must be greater than 0"); if( string.IsNullOrEmpty(s) ) throw new ArgumentNullException("s","the paramater s needs to be set ...");
所以基本参数例外列表如下:
ArgumentException ArgumentNullException ArgumentOutOfRangeException
你写的是前提条件,也是契约式设计中的一个基本要素.谷歌(或"StackOverflow":)用于该术语,你会发现很多关于它的好信息,以及一些不良信息.注意,该方法还包括后置条件和类不变量的概念.
让我们明确断言断言是一种有效的机制.
当然,它们通常(并非总是)未在发布模式下进行检查,因此这意味着您必须在发布之前测试您的代码.
如果断言被启用并且违反了断言,则某些使用断言的语言(特别是在Eiffel中)的标准行为是抛出断言违例异常.
如果您要发布代码库,那么未选中的断言不是一种方便或可行的机制,也不是(显然)一种验证直接可能不正确的输入的方法.如果您有"可能不正确的输入",则必须将输入验证层设计为程序正常行为的一部分; 但你仍然可以在内部模块中自由使用断言.
其他语言,如Java,有更多的传统,即明确检查参数并在出错时抛出异常,主要是因为这些语言没有强大的"断言"或"按合同设计"的传统.
(有些人可能觉得很奇怪,但我发现传统上的差异是可敬的,而不一定是邪恶的.)
另请参阅此相关问题.