当您使用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); ...
}
}
答案 0 :(得分:2)
如果你在循环中调用正则表达式数千次,静态方法会为你实现基于LRU的缓存。
我只是依赖它,除非你的方法在你的应用程序的生命周期中偶尔被调用数千次,你可能最好在你的类中放置一个静态引用。这取决于您的具体用例。
答案 1 :(得分:2)
如果您担心这类内容,那么包装您的解析功能的类应该包含一个私有引用(如果它是静态用法,可能是静态的),如果你担心这种东西。
修改强>
对我来说,这并不是关于性能,因为有内部缓存和Jimmy所提到的所有爵士乐,我认为正则表达式的创建可能不像实际的正则表达式处理那么昂贵。它更多的是关于设计原则:工厂方法或解析实用程序在概念上使用一些内部过滤器(正则表达式)来为您生成列表。如果它是一遍又一遍地使用的那个,那么概念上就是你要创造一次然后保持并一遍又一遍地使用它。
答案 2 :(得分:1)
我几乎总是将正则表达式创建为将要使用它的类的静态成员,或者如果在许多地方使用它,则在常见的utils类中创建。