首页 > 解决方案 > 静态属性延迟加载正则表达式编译选项

问题描述

我有以下类和属性:

public static class Util
{
   private static Regex _regexTest;

   private static Regex RegexTest => _regexTest ?? (_regexTest = new Regex(@"^\+?\d{0,2}", RegexOptions.Compiled));

   public static bool ValidateNumber(string numberAsString)
   {
       if (string.IsNullOrWhiteSpace(numberAsString))
            return false;

       return RegexTest.Match(numberAsString).Success;
   }
 }

如果消费者只将空/空值传递给 ValidateNumber 方法,这是否会延迟加载正则表达式的编译?还是因为这是静态的,它还会编译它吗?

标签: c#lazy-loading

解决方案


Regex 仅numberAsString在运行时第一次非空时构造。那时,它将被编译并可能被缓存。否则,_regexTest将保持为空。更多详情

如果使用 RegexOptions.Compiled 选项构造Regex 对象,它会将正则表达式编译为显式 MSIL 代码,而不是高级正则表达式内部指令。

换句话说,该Regex.Compiled选项导致运行时编译,而不是我们可能猜测的构建时编译。


推荐阅读