c# - IndexOutOfRangeExpection 发生在 Dictionary.Add 方法上

标签 c# generics dictionary windows-runtime indexoutofrangeexception

我在向通用字典 (WinRT C#) 添加值时遇到 IndexOutOfRange 异常。下面是我的代码和异常的堆栈跟踪。

代码:

if (!data.TryGetValue(index, out cells))
{
   cells = new CellCollection();
   data.Add(index, cells);
}

堆栈跟踪:

at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey key, TValue value)

我不希望在添加时发生这种超出范围的异常。我的应用程序仅使用单线程。 我已将值添加到字典中,并在不需要时使用 GC.Collect() 将其从字典中删除。然后根据需要添加该值。

任何人都可以提出解决此异常的建议吗?

最佳答案

在调用 Dictionary<,>.Add 期间有时需要分配一个新的后备数组,因为 Count超过了Dictionary<,>的当前容量。当分配新的托管对象(新数组)时,可能会设置垃圾收集器。您的应用程序将“暂停”并进行垃圾收集。然后,在收集垃圾后,控制将从 Add 内的位置恢复。方法,新的后备数组将填充旧数组中的数据。

但是,根据您对上述问题的评论,您有终结器。必须存在一个正在被终结的不相关的对象(可能是同一类的另一个实例)。似乎它引用了相同的 Dictionary<,> 。在析构函数代码的终结过程中,您更改 Dictionary<,> 的状态。那么当主线程在垃圾回收之后恢复控制时, Dictionary<,> 的状态已更改,但我们正在向其中添加一个新元素 Dictionary<,> .

吸取的教训是:不要编写析构函数(终结器)。无论如何,如果您这样做,请不要更改(可以)从其他地方引用的托管对象的状态(即从不会被收集的“事件”对象)。

马修·沃森在对你的问题的评论中这么说。

关于c# - IndexOutOfRangeExpection 发生在 Dictionary.Add 方法上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26752572/

相关文章:

python - 合并字典

c++ STL map copy 将 bool 值设置为 true

c# - 获取自应用程序启动以来耗时

c# - .NET 如何创建和执行它的窗口、按钮等?

python - 如何遍历所有字典组合

TypeScript - 递归泛型和叶分支问题(终极 TicTacToe)

Java 泛型编译错误 - 类型 <type> 中的方法 method(Class<capture#1-of ? extends Interface>) 不适用于参数

c# - 在 winforms 中取消工作线程

c# - 使用用户名和密码从 WPF 应用程序进行 GitHub 身份验证

c# - 如何在不知道类型的情况下实例化通用列表