在Visual Studio中,有没有一种方法可以调试VB.NET With语句?

5
有时您并不真正关心变量的名称,因为它不会超出子程序的范围。事实上,指定名称会增加一行额外的代码。而且现在您要处理这个名称,这可能会增加潜在的重构工作量(如果以后决定对其进行重命名)。请查看下面的代码:
Dim fileInfo As New FileInfo("filename.txt")
With New FileSystemWatcher
  .Path = fileInfo.DirectoryName
  .Filter = fileInfo.Name
  .EnableRaisingEvents = True
  AddHandler .Changed, AddressOf OnChanged
End With

这是VB.NET中完全有效的构造,看起来简洁明了。然而,在调试时,假设您在With子句内设置断点,则无法选择该.Path以确保其已正确设置。
我是否遗漏了什么或者Visual Studio真的没有提供With语句内.Property语法的调试功能?我使用的是2010版。
显然,以上代码没有太多需要调试的内容,但是有很多例子可以说明这种无名With方法的优点。
顺便说一下,命名的With子句也有同样的问题,即如果我写:
Dim fsw As New FileSystemWatcher
With fsw
  .Path = fileInfo.DirectoryName
  .Filter = fileInfo.Name
  .EnableRaisingEvents = True
  AddHandler .Changed, AddressOf OnChanged
End With

我仍然无法提取.Path的值,必须始终在其前面加上fsw

随着你在彼此嵌套的With子句中的层数增加,问题变得越来越严重。


4
nest With clauses 翻译为:嵌套的 WITH 子句。请考虑孩子们的感受:(此句为表情符号,无法翻译) - asawyer
@asawyer:这些词中肯定隐藏着某种与语言相关的笑话。不幸的是,我不是母语使用者,所以无法理解它。 - Victor Zakharov
1
在即时窗口中尝试 ?.Path,你会得到 Leading '.' or '!' can only appear inside a 'With' statement.。似乎没有办法使用匿名对象,特别是在命名的 With 子句中,你当然可以固定源代码 fsw.Path - djv
2个回答

4
使用未命名变量的With语句对调试器来说是一个巨大的挑战,没有解决办法。但是使用一个小的命名辅助变量像"fsw",它已经存在了,由编译器自动生成。它不是无名的,只是难以言喻。例如VB$t_ref$L0),由于使用了在VB.NET标识符名称中无效的字符,调试器不允许您键入它。这是有意的,因为它确保它永远不会与您使用的名称发生冲突。这也防止它出现在"Autos"窗口中。
您已经通过给变量命名找到了正确的解决方法。从那里开始调试很简单,只需将鼠标悬停在变量名称上,而不是字段名称上。当然,在所有其他调试器窗口中都可以正常工作,特别是"Autos"窗口。如果需要,不要犹豫放弃With语句,直接完整编写语句,IntelliSense可以帮助您使这个过程更加轻松。

谢谢您的回答 - 我会将其标记为已接受。我想在VS中加入一些语法糖以帮助调试会很不错,例如.Path在底层转换为VB$t_ref$L0.Path并显示该值。 - Victor Zakharov

0
一个选择是将这些变量添加到监视列表中,然后从监视窗口查看值。

如果我只有“.Path”,而VS无法识别它,我该怎么做? - Victor Zakharov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接