Почему параметры в конструкторах для ArgumentNullException и ArgumentException меняются на противоположные?
При разработке программного обеспечения я всегда поддерживал согласованность, если нет веской причины быть непоследовательной.
В .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
}
Для меня это кажется действительно нелогичным и часто меня смущает. Есть ли вообще какая-то причина для этого дизайна Microsoft? Существуют ли какие-либо преимущества в обратном порядке при использовании этих двух полученных исключений?
Ответы
Ответ 1
Поскольку конструктор, который принимает только один аргумент, принимает другой аргумент:
ArgumentNullException(String)
принимает paramName
как аргумент, ArgumentException(String)
принимает значение message
.
На самом деле это очень непротиворечиво. Двухстрочный конструктор просто добавляет аргумент, сохраняя первый идентичный.
Обоснование этого, вероятно, потому, что ArgumentNullException
не нуждается в сообщении. Сообщение присуще типу исключений.