在设计软件时,我总是喜欢一致性,除非真的有充分的理由不一致。
在.NET Framework中,我们有ArgumentNullException
和ArgumentOutOfRangeException
,它们都来自ArgumentException
。其中所有3个都有一个构造函数,它接受两个字符串参数 - 一个用于paramName
,另一个用于例外message
。
为什么两个派生类都反转了参数顺序?!
public ArgumentNullException(String paramName, String message)
: base(message, paramName) { }
public ArgumentOutOfRangeException(String paramName, String message)
: base(message, paramName) { }
这意味着在我的调用代码中,它看起来像这样:
public string DoSomething(string name, int age)
{
if (name == null)
throw new ArgumentNullException("name", "Name cannot be null.");
if (name == string.Empty)
throw new ArgumentException("Name cannot be an empty string.", "name");
if (age < 18)
throw new ArgumentOutOfRangeException("age", "Age must be at least 18.");
//Do stuff
}
对我来说,这看起来真的不合逻辑,常常让我感到困惑。微软在这个设计选择上有什么理由吗?使用这两个派生的异常时,反转顺序是否有任何优势?
答案 0 :(得分:14)
因为构造函数只接受一个参数,所以采用不同的参数:
ArgumentNullException(String)
以paramName
作为参数,ArgumentException(String)
需要message
。
这实际上非常一致。双字符串构造函数只是添加一个参数,保持第一个参数相同。
背后的原因,可能是因为ArgumentNullException
不需要消息。该消息是异常类型中固有的。