c# - 静态属性延迟加载正则表达式编译选项
问题描述
我有以下类和属性:
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 方法,这是否会延迟加载正则表达式的编译?还是因为这是静态的,它还会编译它吗?
解决方案
Regex 仅numberAsString
在运行时第一次非空时构造。那时,它将被编译并可能被缓存。否则,_regexTest
将保持为空。更多详情:
如果使用 RegexOptions.Compiled 选项构造Regex 对象,它会将正则表达式编译为显式 MSIL 代码,而不是高级正则表达式内部指令。
换句话说,该Regex.Compiled
选项导致运行时编译,而不是我们可能猜测的构建时编译。
推荐阅读
- graphql - 我的项目仍在使用 graph-i-ql 而不是 Playground
- c# - 为什么不能在数组中交换匿名类型的属性?
- ios - 通过有限长度任务识别应用程序终止
- c++ - GCC 模板参数扣除/替换失败
- python - 运行 python manage.py --settings=[mysettings] 时没有名为 base 的模块
- javascript - 如何将变量放入 .open("GET", "[...]") 中的字符串
- java - 如何使用 println 按单位打印同一列中的数字列表?
- amazon-web-services - AWS Lambda - 无法将 SDK 调用转换为承诺
- java - 如何用 ObservableMap 填充 TableView
> 在 JavaFX 中 - database - 当叶节点处于复制模式时,MemSQL 数据库不可用于读取