2013-04-02 3 views
2

Итак, может быть, я устал, но почему я не могу создать новый MatchCollection?Невозможно создать новый MatchCollection - не определены конструкторы

У меня есть метод, который возвращает MatchCollection по телефону 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(); 

ошибка:

The type 'System.Text.RegularExpressions.MatchCollection' has no constructors defined.

Как можно определить тип конструктора? Я думал, что конструктор по умолчанию будет создан, если конструктор явно не определен. Невозможно создать новый экземпляр MatchCollection для возврата моего метода?

ответ

2

How can a type have no constructors defined?

Не может. Но он может скрыть все его конструкторы, сделав их непубличными, то есть частными, внутренними или защищенными. Более того, как только конструктор определен, конструктор по умолчанию становится недоступным. Другие классы в одном и том же пространстве имен могут обращаться к внутренним конструкторам, но классы, внешние по отношению к пространству имен, не смогут создавать экземпляр класса напрямую.

P.S. Если вы хотите создать пустую коллекцию спички, вы всегда можете сделать выражение, которое соответствует что-то, и передать его что-то другое:

Regex regex = new Regex(@"foo"); 
var empty = regex.Matches("bar"); // "foo" does not match "bar" 
+0

На самом деле, если вы определили конструктор с аргументами, вы не можете использовать конструктор по умолчанию больше, если вы явно не объявить. –

+0

+1. Ahhhh ... не думал о непубличных конструкторах. К сожалению. Благодарю. Поэтому я не могу вернуть пустой 'MatchCollection', если я не сделаю некоторую работу, как упоминал BrunoLM в его ответе? –

1

Возможно, обходной путь:

Если sourceString является null множество его "" и продолжить выполнение.

+0

+1. Хороший совет. Благодаря! –

5

Очень подходящее использование шаблона Null Object!

Реализовать так:

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

    return regex.Matches(sourceString ?? String.Empty); 
} 
+0

+1. Простой, чистый и элегантный. Спасибо. –

Смежные вопросы