Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET正则表达式实例缓存_C#_.net_Regex - Fatal编程技术网

C# .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(@"(?:,.*)"); } 这两个选项中的一个比另一个更可能导致内存问题吗?我知道第二种方法显然会创建更多的实例,但是

我读过,它描述了如何使用.NET正则表达式调用实例与静态方法

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

澄清。例如:

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的传入字符串或类似的废话),那么它将起到不同的作用。