6

我有一个简单的字符串类扩展方法,它将从字符串中删除所有非数字字符。因此,如果我有一个字符串,例如一个电话号码,例如“(555) 215-4444”,它会将其转换为“5552154444”。它看起来像这样:

public static string ToDigitsOnly(this string input)
{
    Regex digitsOnly = new Regex(@"[^\d]");
    return digitsOnly.Replace(input, String.Empty);
}

我只是想知道在这里处理空值的最优雅的方法是什么?在这些情况下是否有一个典型的模式可以遵循,例如如果传入 null 则返回 null 值?似乎因为我在这里扩展了字符串类,所以我可能希望允许空值而不抛出争论异常(因为当我使用它时我并没有真正传递争论......)?但是有些人可能会争辩说我应该像“正常”方法一样抛出异常。您在这里使用的最佳做法是什么?

谢谢!

4

4 回答 4

12

您可以遵循最不意外的原则:使用 LINQ 中实现的模式:

public static string ToDigitsOnly(this string input)
{
    if(input == null)
          throw new ArgumentNullException("input");

    Regex digitsOnly = new Regex(@"[^\d]");
    return digitsOnly.Replace(input, String.Empty);
}

您可以使用Jon Skeet 提出的方法。它会将您的支票减少到

input.ThrowIfNull("input");

Jon 也有一个很好的部分10.2.4 Calling a method on a null reference in C# in Depth,引用:

检查无效性 作为一个尽职尽责的开发人员,我确信您的生产方法总是在继续之前检查其参数的有效性。扩展方法的这个古怪特性自然产生的一个问题是当第一个参数为 null 时抛出什么异常(假设它不是故意的)。它应该是 ArgumentNullException,就好像它是一个普通的参数一样,还是应该是 NullReferenceException,如果扩展方法一开始是一个实例方法会发生什么?我推荐前者:它仍然是一个参数,即使扩展方法语法并不明显。

我认为这个建议是(根据我的个人经验):检查空值总是更好,特别是对于静态方法,不要依赖空值。ThrowIfNull只有当它是您的方法的确切目的时才会出现一个例外,例如IsNullOrEmpty扩展方法。

于 2013-05-16T16:09:44.027 回答
1

简单的 ; 为 String 创建另一个方法,比如 IsInValid()

public static bool IsInValid(this string s) { return (s == null) || (s.Length == 0); }

使用任何你想检查的地方......

此外,您可以在任何地方使用此扩展程序

于 2013-07-19T13:21:50.563 回答
1

只要您很好地传达行为(以便最终用户知道会发生什么),这并不重要。

考虑使用内置的XML 文档注释来传达预期的行为。

/// <exception cref="ArgumentNullException">argument is null.</exception>
public string Example( string argument )
{
    if ( argument == null )
        throw new ArgumentNullException();
    return argument.ToString();
}

有关许多示例,请参阅 MSDN 文档:

于 2013-05-16T16:30:56.663 回答
1

假设我有这个:

class A
{
    public void F()
    {
        //do stuff
    }
}

如果我然后运行以下代码,会发生什么?

A a = null;
a.F();

你得到一个NullReferenceException. 所以我想说编写等效扩展方法的正确方法如下。

class A
{
}

static class AExtensions
{
    void F(this A a)
    {
        if (a == null)
        {
            throw new NullReferenceException();
        }
        //do stuff
    }
}

但是,.NET 不同意我的观点。.NET 中的标准是改为抛出ArgumentException- 所以最好改为这样做。

于 2013-05-16T16:50:09.173 回答