.NET 正则表达式实例缓存

jve*_*ema 1 .net c# regex

我读过这篇文章,其中描述了如何使用 .NET 正则表达式调用实例方法与静态方法。

但是,如果变量本身是静态的怎么办?有谁知道 .NET 是否进行任何可能导致内存泄漏的缓存?

澄清。例如:

public static Regex Foo = new Regex(@"(?:,.*)");
Run Code Online (Sandbox Code Playgroud)

相对:

public static void MyMethod(){
  Regex Foo = new Regex(@"(?:,.*)");
}
Run Code Online (Sandbox Code Playgroud)

其中任何一个比另一个更有可能导致内存问题吗?我知道第二个显然会创建更多实例,但是第一个是否需要担心传入字符串的任何类型的缓存,因为它基本上会永远存在。

spe*_*der 5

如果您有一个实例化的 Regex 对象,并且仅在其上调用实例方法,则不会发生缓存(根据提供的文章)。如果您创建 Regex 对象并将其作为静态属性存储在类中,则您仍在处理实例化对象,因此不会发生缓存(>=.net 2.0)。

另一方面,每次调用 Regex 静态方法,例如 Regex.Match("bla","bla") 时,解析和编译的正则表达式都会被缓存。

编辑

查看您的示例,这两种情况都不会发生缓存。然而,如果第二个例子是:

Match m=Regex.Match(@"(?:,.*)",someString);
Run Code Online (Sandbox Code Playgroud)

...那么编译后的正则表达式(?:,.*)将被缓存,因此您可以高效地进行后续调用,Regex.Match(@"(?:,.*)",...而无需重新解析/重新编译表达式(?:,.*)。我想就内存消耗而言,这几乎完全等同于保留静态实例。另一方面,如果提供给 Regex.Match 的正则表达式发生更改,则将以一些(可能可以忽略不计)费用进行附加条目。