如果字符串为空,我应该抛出ArgumentNullException吗?

Kep*_*boy 54 .net

我正在研究一个给出字符串参数的方法.string参数的有效值是null或string.Empty以外的任何值.所以我的代码看起来像这样.

private void SomeMethod(string someArgument)
{
    if(string.IsNullOrEmpty(someArgument))
        throw new ArgumentNullException("someArgument");

    // do some work
}

没有什么太令人兴奋的了.我的问题是,即使字符串等于string.Empty,也可以抛出ArgumentNullException吗?因为从技术上讲它不是空的.如果你认为它不应该抛出ArgumentNullException应该抛出什么异常?

Ahm*_*eed 39

应该抛出ArgumentExceptionString.Empty.这表示除了null之外的问题.为了避免NullReferenceException我首先检查null,然后我修剪并检查空案例以防止任何空格传递.

private void SomeMethod(string someArgument)
{
    if(someArgument == null)
        throw new ArgumentNullException("someArgument");

    if (someArgument.Trim() == String.Empty)
        throw new ArgumentException("Input cannot be empty", "someArgument");

    // do some work
}
Run Code Online (Sandbox Code Playgroud)

从.NET 4.0开始,您可以使用该String.IsNullOrWhiteSpace方法一次性执行这些检查.通过这样做,您放弃了指定粒度异常类型的能力,因此我会选择ArgumentException并相应地更新消息.

  • ArgumentException构造函数不接受像ArgumentNullException这样的"paramName"参数.所以'抛出新的ArgumentException("paramName")'可能会让人感到困惑,因为它没有说明该参数有什么问题.您应该提供类似的"消息"参数("someArgument可能不是空字符串").在国际应用程序中,此消息需要本地化.因此,如果确实需要区分null case和空字符串case,我只会遇到所有这些麻烦. (4认同)

Ron*_*erg 5

ArgumentException如果空字符串不是您方法的可接受输入,则应该抛出一个.如果你抛出一段ArgumentNullException时间他们没有提供null参数,那么客户可能会非常困惑.

这只是另一个用例.您可能还有不接受空输入值但接受空字符串的方法.在整个应用程序中保持一致非常重要.


Mar*_*rth 5

考虑到已经说过的所有内容(Joe / Ahmad Mageed),那么我将为这种情况创建一个例外。

class ArgumentNullOrEmptyException : ArgumentNullException
Run Code Online (Sandbox Code Playgroud)

  • 从ArgumentException派生会更好吗?在OOP中,说“ A或B”是“ A”似乎并不正确。 (15认同)