C# .NET正则表达式实例缓存
我读过,它描述了如何使用.NET正则表达式调用实例与静态方法 但是,如果变量本身是静态的呢?有人知道.NET是否进行了任何可能导致内存泄漏的缓存吗 澄清。例如:C# .NET正则表达式实例缓存,c#,.net,regex,C#,.net,Regex,我读过,它描述了如何使用.NET正则表达式调用实例与静态方法 但是,如果变量本身是静态的呢?有人知道.NET是否进行了任何可能导致内存泄漏的缓存吗 澄清。例如: public static Regex Foo = new Regex(@"(?:,.*)"); 与: public static void MyMethod(){ Regex Foo = new Regex(@"(?:,.*)"); } 这两个选项中的一个比另一个更可能导致内存问题吗?我知道第二种方法显然会创建更多的实例,但是
public static Regex Foo = new Regex(@"(?:,.*)");
与:
public static void MyMethod(){
Regex Foo = new Regex(@"(?:,.*)");
}
这两个选项中的一个比另一个更可能导致内存问题吗?我知道第二种方法显然会创建更多的实例,但是第一种方法是否有任何类型的传入字符串缓存需要担心,因为它基本上会一直存在。如果您有一个实例化的Regex对象,并且您只对其调用实例方法,然后缓存(根据提供的文章)不会发生。如果创建Regex对象并将其作为静态属性存储在类中,则仍在处理实例化对象,因此不会发生缓存(>=.net 2.0) 另一方面,每次调用Regex静态方法,例如Regex.Match(“bla”、“bla”),解析和编译的正则表达式都将被缓存 编辑 看看您的示例,在这两种情况下都不会发生缓存。然而,如果第二个例子是:
Match m=Regex.Match(@"(?:,.*)",someString);
。。。然后编译的正则表达式
(?:,*)
将被缓存,这样您就可以高效地对Regex.Match(@“(?:,*)”,…
进行后续调用,而无需重新分析/重新编译表达式(?:,*)
。我想就内存消耗而言,这几乎相当于保留一个静态实例。另一方面,如果提供给Regex.Match的正则表达式发生了更改,那么在某些情况下会增加一个条目(可能可以忽略不计)费用。如果您有一个实例化的Regex对象,并且仅对其调用实例方法,则不会发生缓存(根据提供的文章)。如果您创建Regex对象并将其作为静态属性存储在类中,则仍在处理实例化对象,因此不会发生缓存(>=.net 2.0)
另一方面,每次调用Regex静态方法,例如Regex.Match(“bla”、“bla”),解析和编译的正则表达式都将被缓存
编辑
看看您的示例,在这两种情况下都不会发生缓存。但是,如果第二个示例是:
Match m=Regex.Match(@"(?:,.*)",someString);
…然后将缓存编译的正则表达式
(?:,.*)
,这样您就可以高效地对Regex.Match(@“(?:,.*)”,…
进行后续调用,而无需重新分析/重新编译表达式(?:,.*)
。我想就内存消耗而言,这几乎完全等同于保留一个静态实例。另一方面,如果提供给Regex.Match的正则表达式发生了更改,那么将以某种(可能可以忽略不计的)费用创建一个额外的条目。没有“静态实例”这样的东西-只有引用对象的静态变量。同一个对象可以由实例变量、局部变量或静态变量引用。它不会更改Regex
构造函数中的任何代码。没有“静态实例”这样的东西-只有引用对象的静态变量。同一个对象可以由实例变量、局部变量或静态变量引用。它不会更改Regex
构造函数中的任何代码。用示例更新。用示例更新。我不困惑,我确切知道发生了什么;我只是ious如果在Regex实例中存在任何缓存,请删除,以免引起冒犯:)未被占用:)感谢您提供的信息。我并不困惑,我确切地知道发生了什么;我只是好奇在一个Regex.removed的实例中是否有任何缓存在运行,因为害怕引起冒犯:)没有被占用:)谢谢你的信息。好的,很公平。措辞拙劣。问题已经更新了。但是这个问题仍然有效——如果一个给定的正则表达式实例进行了任何类型的缓存(即缓存传递给myRegex.Match的传入字符串或一些类似的废话),那么它将起到不同的作用。好吧,很公平。措辞拙劣。问题已经更新了。但问题仍然存在——如果一个给定的正则表达式实例进行了任何类型的缓存(即缓存传递给myRegex.Match的传入字符串或类似的废话),那么它将起到不同的作用。