Где хранить Regex? - PullRequest
       1

Где хранить Regex?

1 голос
/ 05 марта 2010

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

У меня такое ощущение, что инициализация одного и того же регулярного выражения тысячи раз может быть непосильной. Но я в основном заинтересован в качестве лучшей практики.

Где я должен объявить и определить регулярное выражение?

РЕДАКТИРОВАТЬ: псевдокод:

static Regex regex ...

IEnumerable<string> Parse (string str)
{
    var matches = // use regex
    foreach (var match in matches)
    {
        ...
    }
}

void Main()
{
    foreach (var page in pages)
    {
         Parse (page); ...
    }
}

Ответы [ 3 ]

2 голосов
/ 05 марта 2010

Ваш класс, который включает в себя вашу функцию синтаксического анализа, должен содержать частную ссылку (возможно, статическую, если это статическое использование) на регулярное выражение, если вы беспокоитесь о подобных вещах.

EDIT:

На мой взгляд, дело не в производительности, поскольку из-за внутреннего кеширования и всего того джаза, о котором упоминал Джимми, я думаю, что создание регулярного выражения, вероятно, не так дорого, как фактическая обработка регулярного выражения. Это больше о принципах проектирования: фабричный метод или утилита синтаксического анализа концептуально работают, используя некоторый внутренний фильтр (регулярное выражение) для генерации списка для вас. Если один и тот же используется снова и снова, то это концептуально то, что вы создаете один раз, а затем сохраняете и используете снова и снова.

2 голосов
/ 05 марта 2010

Если вы вызываете регулярное выражение тысячи раз в цикле, статические методы реализуют для вас кэширование на основе LRU.

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

см .: http://blogs.msdn.com/bclteam/archive/2006/10/19/regex-class-caching-changes-between-net-framework-1-1-and-net-framework-2-0-josh-free.aspx

1 голос
/ 05 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...