4

所以,也许我累了,但为什么我不能创造一个新的MatchCollection

我有一个MatchCollection通过调用返回 a 的方法regex.Matches

public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
    Regex regex = new Regex(@"\$\(.+?\)");

    return regex.Matches(sourceString);
}

如果参数为空,我想要做的是返回一个空集合:

public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
    if (sourceString == null)
    {
        return new MatchCollection();
    }

    Regex regex = new Regex(@"\$\(.+?\)");

    return regex.Matches(sourceString);
}

但这不会因为这一行而编译:

return new MatchCollection();

错误:

'System.Text.RegularExpressions.MatchCollection' 类型没有定义构造函数。

一个类型怎么能没有定义构造函数?我认为如果没有明确定义构造函数,则会创建一个默认构造函数。是否无法MatchCollection为我的方法创建一个新实例以返回?

4

3 回答 3

6

非常恰当地使用Null Object模式!

像这样实现:

public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
    Regex regex = new Regex(@"\$\(.+?\)");

    return regex.Matches(sourceString ?? String.Empty);
}
于 2013-04-02T02:30:34.877 回答
3

一个类型怎么能没有定义构造函数?

它不能。但是它可以通过使它们成为非公开的来隐藏它的所有构造函数——即私有的、内部的或受保护的。此外,一旦定义了构造函数,默认构造函数就变得不可访问。同一命名空间中的其他类可以访问内部构造函数,但命名空间外部的类将无法直接实例化一个类。

PS如果你想创建一个空的匹配集合,你总是可以创建一个匹配某些东西的表达式,然后传递给它其他东西:

Regex regex = new Regex(@"foo");
var empty = regex.Matches("bar"); // "foo" does not match "bar"
于 2013-04-02T02:16:04.807 回答
1

也许一种解决方法:

如果将sourceStringnull设置为""并继续执行。

于 2013-04-02T02:18:11.783 回答