创建一个静态Regex对象以供ASP.NET应用程序中的所有线程使用是否有效?

Kar*_*rim 31 .net c# regex asp.net

我需要知道创建一个像这样的静态Regex对象是否安全:

public static Regex s_Regex_ExtractEmails = new Regex(@"\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b");
Run Code Online (Sandbox Code Playgroud)

并从ASP.NET线程静态调用它,如下所示:

s_Regex_ExtractEmails.Matches("my email is mail@email.com")
Run Code Online (Sandbox Code Playgroud)

这会导致任何问题吗?

我这样做基本上是一个优化,以便可以预编译和重用Regex对象.

Jon*_*eet 39

是的,Regex对象是线程安全的.来自文档:

Regex类是不可变的(只读),本质上是线程安全的.可以在任何线程上创建正则表达式对象并在线程之间共享.

您可能也想考虑使用RegexOptions.Compiled- 虽然不要认为它会有助于提高性能; 测量!

  • **警告**:Regex 返回的结果对象(`Match` 和 `MatchCollection`)应该在单个线程上使用。[参见文档](https://msdn.microsoft.com/en-us/library/6h453d2h.aspx) (2认同)