【问题标题】:C# static methods & attributes: Object reference not set to an instance of an objectC# 静态方法和属性:对象引用未设置为对象的实例
【发布时间】:2012-08-19 08:56:22
【问题描述】:

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

谁能解释一下?

【问题讨论】:

  • allRegexes 本身不是一个有效的语句...?

标签: c# .net static-methods


【解决方案1】:

静态字段按声明顺序初始化。这意味着当您初始化 _allRegexes 时,_regexCategorynull

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

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

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

这意味着您可以通过在课程中将_regexCategory 放在_allRegexes 之前来修复您的代码。

【讨论】:

  • 对此感到抱歉..当时很混乱..哈哈..实际上我回答的是同一件事,但downvoted..?
  • 如果添加静态构造函数呢??
  • @Kevin 静态构造函数将在字段初始化后运行。字段初始化器仍然以文本顺序运行。
【解决方案2】:

此代码无需 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");
    }
}

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

【讨论】:

    【解决方案3】:

    应该是

        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 它..

    当您使用 new 关键字实例化 _regexCategory 时,它是 initalizes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多