在我的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();
}
}
}
对象引用未设置为对象的实例。 描述:执行当前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
答案 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();
..
..
}