[已解决问题] 一个Dictionary的怪问题
提问时间: 2008-07-04 15:05
悬赏分:20 浏览:288 次

程序代码如下:

private IDictionary<string, BtsClass> btsClassList = new Dictionary<string, BtsClass>();

 BtsClass tempClass = null;
 if (!btsClassList.Keys.Contains(btsName))
     {
       tempClass = new BtsClass(btsName, 15);
       tempClass.MaginDelegate += new MaginDelegate(BtsClass_MaginDelegate);
       btsClassList[btsName] = tempClass;//这个地方,出现错误。。。
     }
     else
     {
       tempClass = btsClassList[btsName];
     }

如上的代码,在标著的地方,出现了这样的错误:

System.IndexOutOfRangeException: 索引超出了数组界限。
   在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   在 System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)

 

实在是搞不明白,怎么会出现如上的错误....

请各位老大帮忙看看.

 

提问者:颜昌钢 - 初学一级

问题补充:反编译查看了下Directory的代码:
btsClassList.Add(btsName,tempClass);

btsClassList[btsName] = tempClass;
最终的不同在于调用 Insert(TKey key, TValue value, Boolean add)
这个方法传递的参数不同.

前一种方法的Boolean add 为true;
后一种方法的Boolean add 为false;

而唯一用到这个 参数的地方 只有一处:
for (int i = this.buckets[index]; i >= 0; i = this.entries[i].next)
{
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
this.entries[i].value = value;
this.version++;
return;
}
}

看了下,不管用哪种方法,似乎还是会存在 错误的可能....

索引超出数组界限....看见这个问题的时候,最开始以为btsClassList[btsName] = tempClass; 这样使用,当空间不够的时候,没有重新申请空间 才会导致 有这样的错误.
看了下源代码,实际上当 栈间不够的时候,有重新在分配的过程........


//2008-07-04 18:49:00
呵呵,产生这样的错误,最终可能在于:
1:程序 多线程
2:Directory 不是线程安全的......

参考:
1:http://forums.msdn.microsoft.com/zh-CN/netfxbcl/thread/c8a83d23-a62e-4e37-a902-8e229bf3c31f/
2:http://forums.msdn.microsoft.com/zh-CN/csharpgeneral/thread/283a0e50-749e-43de-9f3c-6af314ff31be/

所有回答(2)
btsClassList[btsName] = tempClass;//这个地方,出现错误。。。 老兄JS写多了,入戏太深了吧 .Add(
3个月前   回答者:t-mac.NET - 菜鸟二级
问题解决如楼上所说 IDirectory支持这么用,但是Directory不允许,如果声明IDirectory是Hashtable的话就可以这么用。
3个月前   回答者:玉开 - 大侠五级
评论
3个月前   颜昌钢 :

反编译查看了下Directory的代码:
btsClassList.Add(btsName,tempClass);

btsClassList[btsName] = tempClass;
最终的不同在于调用 Insert(TKey key, TValue value, Boolean add)
这个方法传递的参数不同.

前一种方法的Boolean add 为true;
后一种方法的Boolean add 为false;

而唯一用到这个 参数的地方 只有一处:
for (int i = this.buckets[index]; i >= 0; i = this.entries[i].next)
{
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
this.entries[i].value = value;
this.version++;
return;
}
}

看了下,不管用哪种方法,似乎还是会存在 错误的可能....




   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接