我得到一个'对象引用没有设置为对象的实例'错误,我无法解释为什么我在全局声明和创建对象。
当我尝试将第一个项目添加到字典时触发异常。继承我的代码:
//declared at the top of my page globally
Dictionary <String, MyCustomType> MyDictionary = new Dictionary();
MyCustomType myCustomType = new MyCustomType();
//Then later in a (private void) method:
//First part of if statement checks if we already have anything in there
//and if the key already exists. If so, it overwrites it
if (MyDictionary != null && MyDictionary.ContainsKey(some_string)
{
// replace the item in the dictionary
}
// if the dictionary is null or the key isnt already in the dictionary.
// This is where it is throwing the exception
else
{
MyDictionary.add(some_string, myCustomType)
}
调试时,它确实说MyDictionary是null,但这是预期的,因为我还没有任何东西,并且else语句中的add的行为放在那里,所以我真的不确定为什么它在这里抛出一个例外。调试还显示some_string和myCustomType具有我期望它们具有的值。有人可以帮忙吗?
答案 0 :(得分:2)
保持简单:
if (MyDictionary == null) MyDictionary = new Dictionary<string, CustomType>();
MyDictionary[some_string] = myCustomType;
答案 1 :(得分:2)
即使您确定没有空引用,也必须有一个;否则你不会得到NullReferenceException
。运行时通常是正确的。
myDictionary
的代码在中运行?myDictionary
的初始化始终在使用它的私有方法之前运行? 现在开始做其他事情:
myDictionary[key] = value;
将在两种情况下都有效,即当字典还没有key
的条目时,以及当key
已有条目时。
使用[]
优于当前的两步流程(首先使用ContainsKey
检查,然后Add
或更新)更加原子化;在这两个步骤之间,另一个线程干扰您的字典的风险较小。 (虽然,事实是,如果这是一个问题,你可能最好使用ConcurrentDictionary
。)
答案 2 :(得分:1)
在调用MyDictionary
MyDictionary.add(...
是否为null并实例化它。
该行:
Dictionary <String, MyCustomType> MyDictionary = new Dictionary();
不会编译,所以我不确定你的代码中有什么。
您需要将代码更改为:
if (MyDictionary != null && MyDictionary.ContainsKey(some_string)
{
...
}
else
{
if (MyDictionary == null)
{
MyDictionary = new Dictionary<String, MyCustomType>();
}
MyDictionary.Add(some_string, myCustomType);
}
答案 3 :(得分:0)
我认为你应该像这样重拍你的
if (MyDictionary != null)
{
if(MyDictionary.ContainsKey(some_string)
{
// replace the item in the dictionary
}
// if the dictionary is null or the key isnt already in the dictionary. This is where it is throwing the exception
else
{
MyDictionary.add(some_string, myCustomType)
}
}