带有 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();
..
..
}
在我的 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();
..
..
}