string.IsNullOrEmpty returns true when supplied string is not null
我有一个单元测试,该调用在传入字符串的对象上调用方法。
被调用的方法要做的第一件事就是检查字符串是否为null或为空。
但是,无论filePath的值是什么,对string.IsNullOrEmpty的调用都为true。 参见下图。
我在这里想念什么吗?
编辑:
检查null和string.Empty分别按预期工作:
编辑2:
我已经清理了解决方案,通过文件系统删除了bin目录,并且在重建之后,调试器仍然显示应该抛出ArgumentNullException,尽管实际上并没有抛出该异常。
-
而您得到的异常确实是ArgumentNullException吗?还是由于某种原因,调试器可能会在错误的行中显示其他异常?
-
您是否分别检查了"空"和"空"?结果如何?
-
@hvd:我抛出该异常
-
是否可能有多个线程正在访问您的方法,而您只能看到其中一个线程的状态?
-
在该类的多个级别上没有定义filePath,不是吗?
-
@Maciej那不是我要的:)调试器可能会显示一行代码,好像它正在被执行,即使它不是实际执行的,通常也可以(但不仅限于)在发布模式下构建。您的屏幕截图并未显示出确实引发的异常。
-
@b_meyer:不。这是一个单元测试
-
我的猜测是您构建的程序集与您的源代码不匹配。尝试全部重建,重新启动VS,删除任何现有的测试结果目录等。
-
添加一个else条件,强制filePath为null或空字符串,然后发布该测试的结果。
-
@Drasive:我已经用您的建议更新了这个问题。另外,filePath不为null且不等于String.Empty
-
您应该真正考虑清除然后重建解决方案。你做完了吗?
-
@hvd:你是对的...它正在进入那里但是实际上并没有引发异常...
-
@Deeko:我已经彻底检查了这种情况,但事实并非如此。尽管如此,还是个好电话。
-
您是否在调试时尝试过评估表达式string.IsNullOrEmpty(filePath)(例如通过Watch)?它告诉你什么?
-
@Andrei:通过"即时"窗口运行,该表达式的计算结果为false。
-
您正在使用发布版本吗?
-
那么显然这是调试器如何可视化代码执行的问题。似乎引发异常本身的代码未执行。为了进行仔细检查,您可以在if内临时插入更多行,实际上可以检查执行情况(控制台输出,数据库写入等)。
-
@svick:不。它设置为调试
filePath的内容绝对不为null(也不为空),因此我们有两个选择:
-
您有一个名为filePath的范围更广的范围变量(即全局变量),该变量在null时为空
-
您的调试器正在引用较旧版本的二进制文件。在这种情况下,找出并重建解决方案
更新资料
您的问题更新使我认为(上面的)第二个选择是
-
我继续清理解决方案并进行了重建。尽管如此,尽管调试器显示它正在执行该行,但实际上并没有在if语句内抛出ArgumentNullException。
这是我第一次遇到此问题。
我们现在逐步解决的方法是在IF语句的后面添加以下内容。
1 2 3 4 5 6
| #if DEBUG
else
{
// A hack to fix the debugger issue on the IsNullOrEmpty statement above.
}
#endif |
我也在Visual Basic中使用If String.IsNullOrEmpty(foo)体验到这一点。我同意Andrei的评论,这似乎与调试器如何可视化此特定结构有关。
清理/重建不影响它。有趣的是,如果您在If语句中添加了更复杂的主体,则调试器将仅在主体的最后一行暂停(即黄色箭头)。它实际上并不执行代码行。
如果有人可以向我们提供某些原因的信息,那将很有趣。
这是我看到的代码:
请注意,即使myItem.Subject不为null,调试器箭头也位于行e.Cancel = True上。当我按F10键时,箭头将前进到ElseIf语句,并且e.Cancel仍为False。
同样,当调试器在这条线上时,我无法像往常一样将箭头拖到另一行。如果我尝试通过拖动黄色箭头移动到另一行,则会出现以下错误:
-
您可以在简短但完整的程序中重现此内容,我们可以尝试吗? (如果您也使用VS声明您的版本,也会有帮助...)
-
呵呵,我没意识到这将很难复制。我以为这是经常发生或特定于IsNullorEmpty的事情,但是我想前提条件比这更具体。添加了更多信息(不好意思的代码,我没有写)。
-
您是否可以使代码进入不需要Outlook集成的状态,然后将代码作为文本发布?基本上,我希望能够复制/粘贴/复制...
-
对。我将其发布为图像以显示值和调试器突出显示。无论如何,这是一个庞大项目的一部分,我怀疑复制/粘贴此特定代码段是否有用。我将查看是否可以删除它而不会丢失行为。
-
我无法隔离该错误。有太多的依赖项。减少代码的任何尝试实质上都涉及重写此函数,从而消除了可疑的行为。假设我给了您一个可以重现此内容的10行代码段,您将如何处理该代码?我愿意尝试使用我的大型代码库提出的任何想法。