具有Readonly Hashtable的嵌套内部类在赋值时抛出空引用异常..

时间:2015-04-25 08:09:24

标签: c# design-patterns compiler-errors hashtable nullreferenceexception

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

在我的internal GamerTags 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();
        }
    }
}

&#39; /&#39;中的服务器错误应用

对象引用未设置为对象的实例。   描述:执行当前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

2 个答案:

答案 0 :(得分:2)

使用

初始化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修饰符,您只有另一个选项来初始化它,这是在您的类的构造函数中,如

internal class GamerTags
{
    private readonly Hashtable _privateReadonlyHashTable;

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

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

答案 1 :(得分:2)

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

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

    ..
    ..
}