静态“便捷”函数

04-13Ctrl+D 收藏本站

关灯 直达底部

Static"Convenience"Functions

在第413页的“正则表达式快速入门”中已经看到,我们并不需要每次都显式地创建Regex对象。我们可以通过下面的静态函数直接使用正则表达式:

其实它们不过是包装了已经介绍的主要的 Regex构造函数和方法而已。它们会临时创建一个Regex对象,用它来调用请求的方法,然后弃用这个对象(其实并没有弃用,稍后介绍)这里有个例子:

它等价于:

或者,更确切地说是:

使用这些便捷函数的好处在于,代码因此更清晰易懂。面向对象式处理看起来像函数式处理(☞95),坏处在于每次调用都必须重新检查pattern字符串。

如果在整个程序的执行过程中,正则表达式只用到 1 次,就不需要考虑便捷函数的效率问题。但是,如果需要应用多次(例如在循环中,或者是频繁调用的函数中),每次准备正则表达式都需要代价(☞241)。创建 Regex 对象,然后重复使用的主要原因之一就是,使用便捷函数的效率太低。不过,下一节将告诉我们,.NET提供了一种很好的解决办法:兼具面向对象的效率和函数式处理的便捷。

正则表达式缓存

Regex Caching

为简单的正则表达式构建并管理Regex对象很不方便,所以.NET的正则包提供了各种静态方法。但这些静态方法存在效率缺陷,即每次调用都需要创建临时的Regex对象,应用它,然后弃用。如果在循环中需要多次应用同样的正则表达式,就需要进行许多不必要的工作。

为了避免重复的工作,.NET Framework能够缓存静态方法创建的临时变量。第6章已经大致介绍过缓存(☞244),简单地说,缓存的意思就是如果你希望在静态方法中使用“最近”使用过的正则表达式,此方法就会重用之前创建的正则对象,而不是重新创建一个新对象。

“最近”的默认意义是缓存 15 个正则表达式。如果循环中使用的正则表达式超过15 个,则第16个正则表达式会取代第1个,所以进入下一轮循环时,第一个正则表达式已经不在缓存中,必须重新生成。

如果默认值15太小,可以这样调整:

Regex.CacheSize=123

如果希望禁用缓存,可以将其设置为0。