为什么ArgumentNullException和ArgumentException的构造函数中的参数是相反的?

时间:2014-02-13 10:22:34

标签: c# .net

在设计软件时,我总是喜欢一致性,除非真的有充分的理由不一致。

在.NET Framework中,我们有ArgumentNullExceptionArgumentOutOfRangeException,它们都来自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
}

对我来说,这看起来真的不合逻辑,常常让我感到困惑。微软在这个设计选择上有什么理由吗?使用这两个派生的异常时,反转顺序是否有任何优势?

1 个答案:

答案 0 :(得分:14)

因为构造函数只接受一个参数,所以采用不同的参数:

ArgumentNullException(String)paramName作为参数,ArgumentException(String)需要message

这实际上非常一致。双字符串构造函数只是添加一个参数,保持第一个参数相同。

背后的原因,可能是因为ArgumentNullException不需要消息。该消息是异常类型中固有的。

相关问题