我正在使用静态方法和属性,当我调用静态方法时,我得到NullReferenceException
。
样本类:
internal class Utils
{
private static Regex[] _allRegexes = { _regexCategory };
private static Regex _regexCategory = new Regex(@"(?<name>c(ategory){0,1}):(?<value>([^""\s]+)|("".+""))\s*", RegexOptions.IgnoreCase);
public static string ExtractKeyWords(string queryString)
{
if (string.IsNullOrWhiteSpace(queryString))
return null;
_allRegexes[0];//here: _allRegexes[0]==null throw an exception
}
}
原因:
_allRegexes [0] == null
我无法弄清楚为什么会发生这种情况,我认为_allRegexes
应该在我调用该方法时进行初始化。
有人可以解释一下吗?
答案 0 :(得分:2)
静态字段按声明顺序初始化。这意味着,当您初始化_regexCategory
时,null
为_allRegexes
。
类的静态字段变量初始值设定项对应于以它们出现在类声明中的文本顺序执行的赋值序列。
(引自C#语言规范版本4.0 - 10.5.5.1静态字段初始化)
这会导致_allRegexes
成为包含单个null
元素的数组,即new Regex[]{null}
。
这意味着您可以在_regexCategory
之前将_allRegexes
放在班级中来修复代码。
答案 1 :(得分:1)
应该是
private static Regex _regexCategory = new Regex(@"(?<name>c(ategory){0,1}):(?<value>([^""\s]+)|("".+""))\s*", RegexOptions.IgnoreCase);
private static Regex[] _allRegexes = { _regexCategory };
在您的代码中,IL
会将_regexCategory
加载到_allRegexes
NULL
,因为IL从来没有initialized
..
initalizes
时 _regexCategory
答案 2 :(得分:1)
此代码无NRE
internal class Utils
{
private static Regex _regexCategory = new Regex(
@"(?<name>c(ategory){0,1}):(?<value>([^""\s]+)|("".+""))\s*",
RegexOptions.IgnoreCase);
private static Regex[] _allRegexes = { _regexCategory };
public static string ExtractKeyWords(string queryString)
{
if (string.IsNullOrWhiteSpace(queryString))
return null;
//change it to your needs, I just made it compile
return _allRegexes[0].Match(queryString).Value;
}
}
class Program
{
static void Main(string[] args)
{
string result = Utils.ExtractKeyWords("foo");
}
}
我认为问题在于参数初始化的顺序。