带有 Readonly Hashtable 的嵌套内部 Class 在赋值时抛出 Null 引用异常

Nested Internal Class with Readonly Hashtable throws Null ref exception.. on assignment

在我的 internal Game class 中,我 a) 定义了另一个嵌套的 internal GamerTags class 和 b) 定义了一个 GamerTags[] _array 变量。

在我的 internal GamerTags class (嵌套 class,为简单起见,我将其省略) 我有一个 readonly Hashtable。初始化后,我尝试赋值时仍然得到 null ref exception我不改变指针,只改变值,我需要为 Hastable 添加另一个初始化吗?

internal class GamerTags
    {
        private readonly Hashtable _privateReadonlyHashTable;
        private string _json;
        private string _hash;

        internal IDictionary privateReadonlyHashTable
        {
            get
            {
                return this._privateReadonlyHashTable;
            }
        }

        internal string Hash
        {
            get
            {
                this.EnsureHash();
                return this._hash;
            }
        }           

        internal object this[string key]
        {
            get
            {
                return this._privateReadonlyHashTable[key];
            }
            set //throws an exception
            {
                this._privateReadonlyHashTable[key] = value;
            }
        }

        internal string Json
        {
            get
            {
                if (string.IsNullOrEmpty(this._json))
                {
                    this._json = myJsonSerializer.Serialize(this._privateReadonlyHashTable);
                }
                return this._json;
            }
        }

        internal int X
        {
            get;
            private set;
        }

        internal int Y
        {
            get;
            private set;
        }

        internal GamerTags(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }

        private void EnsureHash()
        {
            bool flag = false;
            if (string.IsNullOrEmpty(this._hash))
            {
                if (flag)
                {
                    if (this.Json.Length < 100)
                    {
                        this._hash = this.Json;
                        return;
                    }
                    byte[] bytes = Encoding.ASCII.GetBytes(this.Json);
                    byte[] numArray = (new SHA1CryptoServiceProvider()).ComputeHash(bytes);
                    this._hash = Convert.ToBase64String(numArray);
                    return;
                }
                this._hash = this.FastHash();
            }
        }

        private string FastHash()
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach (string key in this._privateReadonlyHashTable.Keys)
            {
                stringBuilder.Append(key);
                stringBuilder.Append("_");
                stringBuilder.Append(this._privateReadonlyHashTable[key]);
                stringBuilder.Append("_");
            }
            return stringBuilder.ToString();
        }
    }
}

“/”应用程序中的服务器错误。

对象引用未设置为对象的实例。 说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

初始化和赋值

        int a = 2; int b = 0;
        GamerTags GamerTag = new Game.GamerTags(a, b);
        GamerTag["Fuel"] = "Loaded";              //throws an exception
        GamerTag["EngineStatus"] = (boolIsItOn ? 1 : 0); //throw an exception too

当您使用

初始化 class GametTags 时
 GamerTags GamerTag = new Game.GamerTags(a, b);

似乎没有代码初始化内部 HashTable _privateReadonlyHashTable

一个简单的解决方法是在声明

的同时初始化HashTable
internal class GamerTags
{
    private readonly Hashtable _privateReadonlyHashTable = new HashTable();

    .....
    internal GamerTags(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
    ......
}

鉴于您的内部 Hashtable 标有 readonly 修饰符这一事实,您只有另一个选项来初始化它,并且这是在您的 class 的构造函数中,例如

internal class GamerTags
{
    private readonly Hashtable _privateReadonlyHashTable;

    .....
    internal GamerTags(int x, int y)
    {
        _privateReadonlyHashTable = new HashTable();
        this.X = x;
        this.Y = y;
    }
    .....
}

但我更喜欢第一种方法,因为如果你添加一个新的构造函数,那么你应该记住将 Hashtable 的初始化也放在新的构造函数中,如果你忘记这样做,那么你会引入一个微妙的错误可能很难发现。

您确实需要实例化 _privateReadonlyHashTable 字段。

internal class GamerTags
{
    private readonly Hashtable _privateReadonlyHashTable =  new Hashtable();

    ..
    ..
}