【问题标题】:Why does my collection decide to start at 0 instead of 1?为什么我的收藏决定从 0 而不是 1 开始?
【发布时间】:2009-04-15 17:21:58
【问题描述】:

我遇到了一个问题,即在服务的线程上运行时无法正确访问对象集合。我可以在 VS2008 中很好地运行我的单元测试,但是当我将调试器附加到服务时,我可以清楚地看到它不是从基于 1 的索引开始,而是从基于 0 的索引开始。我已经尝试了所有我能想到的来隔离它,唯一的区别是它在服务中,而不是作为命令行应用程序运行。

当我调试该函数时,我还会收到一条“属性评估失败”消息,而在我的单元测试中运行它时却没有。

请指教。

[编辑]

我知道数组通常从 0 开始。我一直假设这一点,但今天我发现了这个错误并确定即使我认为它从 0 开始,调试器显示它从 1 开始。当我迭代通过集合,它在 VS 中获得正确的值,但在服务中却没有。

[编辑]

我正在使用 Microsoft.VisualBasic.Collection,因为我可以对它设置密钥。字典对象也可以被使用,但它现在是这样设置的,这就是我的 BLL 基类和其他众多函数读取它的方式,因此最好不要更改它。

[解决方案]

我使用字典和 Generic.KeyValuePair(Of String, Object) 重构了我的代码,这样我就不必重写访问键的代码。现在应该可以正常工作了,因为它不像 collecitons 对象那样处理集合。

【问题讨论】:

  • 您使用的是什么类型的集合?
  • Microsoft.VisualBasic.Collection

标签: .net visual-studio-2008 multithreading debugging service


【解决方案1】:

默认情况下,.NET 语言从数组索引 0 开始,除非您明确指定 VB.NET 从 1 开始。

我不相信有办法在 VB 程序集之外强制执行此数组约定,因此,当它们通过 Windows 远程处理或 Web 服务时,它们会恢复为从 0 开始的索引约定。

为了您的理智,我建议您重构所有代码以改用 0 索引的集合和数组。

更新

根据您的 cmets,您说您使用了 Microsoft.VisualBasic.Collection 对象。 Microsoft.VisualBasic.Collection 对象使用 1 作为其起始索引。使用 ArrayList 对象,或者更好的是通用 List 对象。

【讨论】:

  • 我一直以为我有。当我调试它时,我发现它在内部只是从 1 开始,但在服务上它从 0 开始。实际上我直到今天才知道山雀已经这样做了,因为我以前从未遇到过任何问题。跨度>
  • 我使用集合是因为​​我想针对对象存储一个密钥。我本可以使用字典,但没有,现在我真的不想为了这个而重构大量的代码。
【解决方案2】:

.NET Framework 中的所有集合都从 0 开始,数组也是如此。总是。

在您的 cmets 中,您正在使用一些特殊的 Visual Basic 集合类型。我建议你改掉这个习惯,因为我相信这种类型是为了与 VB6 互操作。

【讨论】:

  • 他们应该但出于某种原因.net 在集合对象中添加一个条目并正常从 1 开始。
  • 有见地,我不知道。
猜你喜欢
  • 2011-02-16
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2014-07-05
相关资源
最近更新 更多