3

我正在使用静态方法和属性,当我调用静态方法时,我得到一个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应该在调用该方法时进行初始化。

谁能解释一下?

4

3 回答 3

2

静态字段按声明顺序初始化。这意味着_regexCategorynull你初始化_allRegexes.

类的静态字段变量初始化器对应于一系列赋值,它们按照它们在类声明中出现的文本顺序执行。

(引自 C# 语言规范版本 4.0 - 10.5.5.1 静态字段初始化)

这导致_allRegexes成为一个包含单个null元素的数组,即new Regex[]{null}.

_regexCategory这意味着您可以通过在您的课程中添加before来修复您的代码_allRegexes

于 2012-08-19T09:11:21.637 回答
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

于 2012-08-19T08:58:45.530 回答
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");
    }
}

我相信问题出在参数初始化的顺序上。

于 2012-08-19T09:11:39.067 回答