所以,也许我累了,但为什么我不能创建一个新的MatchCollection
?
我有一个通过调用MatchCollection
返回regex.Matches
的方法:
public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
Regex regex = new Regex(@"\$\(.+?\)");
return regex.Matches(sourceString);
}
如果参数为null,我想要做的是返回一个空集合:
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
的新实例?
答案 0 :(得分:6)
非常恰当地使用Null Object模式!
像这样实施:
public static MatchCollection GetStringsWithinBiggerString(string sourceString)
{
Regex regex = new Regex(@"\$\(.+?\)");
return regex.Matches(sourceString ?? String.Empty);
}
答案 1 :(得分:3)
如何定义类型没有构造函数?
它不能。但是它可以通过使它们非公开 - 即私有,内部或受保护来隐藏它的所有构造函数。此外,一旦定义了构造函数,默认构造函数就变得不可访问。同一名称空间中的其他类可以访问内部构造函数,但名称空间外部的类将无法直接实例化类。
P.S。如果你想创建一个空的匹配集合,你总是可以创建一个匹配某个东西的表达式,并将其传递给其他东西:
Regex regex = new Regex(@"foo");
var empty = regex.Matches("bar"); // "foo" does not match "bar"
答案 2 :(得分:1)
也许是一种解决方法:
如果sourceString
为null
,请将其设置为""
并继续执行。