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]==ヌル

なぜこれが起こるのかわかり_allRegexesません。そのメソッドを呼び出すときに初期化する必要があると思います。

誰でも説明できますか?

4

3 に答える 3

2

静的フィールドは宣言順に初期化されます。これ_regexCategorynull、初期化するときであることを意味します_allRegexes

クラスの静的フィールド変数初期化子は、クラス宣言に現れるテキストの順序で実行される一連の代入に対応します。

(C# 言語仕様バージョン 4.0 - 10.5.5.1 静的フィールドの初期化から引用)

これにより、単一の要素_allRegexesを含む配列になります。nullnew 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がそれを持っていなかったので、ILがロード_regexCategoryされます.._allRegexesNULLinitialized

newキーワードで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 に答える