C#静态方法& attributes:对象引用未设置为对象的实例

时间:2012-08-19 08:56:22

标签: c# .net static-methods

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

有人可以解释一下吗?

3 个答案:

答案 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");
    }
}

我认为问题在于参数初始化的顺序。