代码之家  ›  专栏  ›  技术社区  ›  Jerod Venema

.NET Regex实例缓存

  •  0
  • Jerod Venema  · 技术社区  · 15 年前

    我读过 this article 它描述了如何使用.NET regex调用实例和静态方法。

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

    澄清。例如:

    public static Regex Foo = new Regex(@"(?:,.*)");
    

    对比:

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

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   spender    15 年前

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

    另一方面,每次调用regex静态方法(如regex.match(“bla”,“bla”),解析和编译的正则表达式都将被缓存。

    编辑

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

    Match m=Regex.Match(@"(?:,.*)",someString);
    

    …然后是编译后的正则表达式 (?:,.*) 将被缓存,因此您可以有效地对 Regex.Match(@"(?:,.*)",... 不需要重新分析/重新编译表达式 ?:* . 我想就内存消耗而言,这几乎等同于保持静态实例。另一方面,如果提供给regex.match的正则表达式发生了更改,那么将以某种(可能可以忽略的)开销进行额外的输入。

        2
  •  2
  •   Jon Skeet    15 年前

    没有“静态实例”这样的东西-只有静态实例 变量 指的是物体。同一对象可以由实例变量、局部变量或静态变量引用。它不会更改 Regex 构造函数。