【问题标题】:Debugging Designer processing in VS 2008VS 2008 中的调试设计器处理
【发布时间】:2008-09-21 12:13:44
【问题描述】:

我以ListE<T> 类型的形式设置了一个公共属性,其中:

public class ListE<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

是的,它很拗口,但这是设计器要求它在“属性”窗口中显示为可编辑集合的条件。它做了什么!因此,我单击 [..] 小按钮来编辑集合,然后单击添加以将项目添加到集合中。

算术运算导致溢出。

现在,这是一个非常基本的列表,只不过是一个扩展数组。整个事情中唯一接近算术的部分是扩展函数,即使它使用左移而不是乘法,也不会溢出。这一切都让我认为这个异常是在设计器内部引发的,可能是由于我对实现细节的一些小疏忽造成的,但我找不到测试或调试该场景的方法。有人有什么聪明的主意吗?

编辑:是的,我可以成功使用该属性,甚至可以手动使用,即。在OnLoad 处理程序中,我想如果我不能让它工作,我将不得不求助于它,但这并不理想。 :(

【问题讨论】:

  • 与你的问题无关,但要注意只能指定ListE实现IList
  • 我不想告诉你,但标准库中的 List 具有完全相同的签名。如果你在 VS 中输入“List”并按 F12,它会带你进入一个重构的定义。
  • 事实上,IList 本身与 IEnumerable 一起实现了其他通用接口,所以我可以将其简化为 ListE : IList, IList,但这种方式更明确.

标签: .net winforms visual-studio-2008 designer


【解决方案1】:

我不明白是什么促使您尝试以这种方式重新发明 List 轮子,但要回答您的问题:我会在构造函数中添加一行“System.Diagnostics.Debugger.Break()”你的班级。

然后尝试在设计器中使用它,您会收到一个弹出窗口,询问您是否要附加调试器。附加 Visual Studio 的第二个实例作为调试器,您将能够在代码中设置一些断点并开始调试。

【讨论】:

  • 重新实现轮子会很有趣。也没有多态合理的方式来扩展任何基本集合以包含事件,因为定义的函数都不是可覆盖的,因此如果我将其转换回原始类,我将不再收到任何事件。
  • 为了记录,除其他外,它出于某种原因试图使用 CopyTo(),而我没有实现它。先解决这个问题,然后看看我们从那里去哪里......
【解决方案2】:

一个开始的地方是它可能正在使用您的 ListE`1::Count 属性进行数学运算。如果这有一些微妙的缺陷(即它比返回 this.innerList.Count 更复杂),它可能会导致设计者在某些操作上出现算术溢出。通常不会发生算术溢出,除非特别要求使用

checked
{
   // ...
}

语法。

【讨论】:

  • 我的 Count 属性很简单: public int Count { get { return _maxIndex + 1; } } 其中 _maxIndex 是数组中的最后一个元素。
  • 我也绝对没有任何已检查的 {} 代码,所以这只能证明它发生在 Designer 的某个地方,不是吗?
  • @monoxide:可能是您的 _maxIndex + 1 溢出,或者他们使用您的 _maxIndex+1 的方式(比如 Int32.MaxValue)溢出。最重要的是,我不完全确定您是如何进行调试的。
  • Joe 解决了如何调试它,至于溢出的内容,在我的扩展方法中是 _list.GetUpperBound(0) * 2。设计者不知何故将(受保护的)列表设置为零长度数组。最好的猜测,它试图评估 ((uint) -1) * 2。
【解决方案3】:

您不必添加 Debugger.Break();调用你的代码来调试它。你可以打开一个不同的 VS 实例并附加到你使用它的那个实例上,你应该能够毫无问题地调试它(只要确保你已经加载了符号)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2011-03-21
    • 2017-10-19
    相关资源
    最近更新 更多