C#学习教程:代码在发布与调试中的行为不同如果我在发布模式下附加调试器,测试就会通过。这里要发布的代码太多了,所以我真的只是在寻找调试发布模式问题的最佳实践。我检查了:解决方案:在这种情况下,这是因为我正在比较浮点变量的相等性。如果不进行重大重构,我无法将浮点数更改为十进制,因此我添加了一个扩展方法:)<=精度);}publicstaticboolAlmostEquals(thisfloatf1,floatf2){returnAlmostEquals(f1,f2,.00001f);}publicstaticboolAlmostEquals(thisfloat?f1,float?f2){if(f1.HasValue&&f2.HasValue){returnAlmostEquals(f1.Value,f2.Value);}elseif(f1==null&&f2==null){返回真;}返回假;由于它似乎与浮点相关,所以有很多地方可能出错。请参阅:C#-.NET上32位和64位数学运算的不一致结果以及双精度问题浮点数可以搞乱很多事情。比较浮点数是否相等是一个普遍的禁忌。您可以检查小于合理epsilon的差异。可能导致您所看到的行为的一件事是导致竞争条件的错误。附加调试器可以改变代码的时序,从而不再触发竞争条件。要修复它,请在有多个线程访问数据时适当地使用同步。我在IsEqual方法中比较一些浮点值。这听起来真是个坏主意。您不应该比较浮点数是否相等,因为浮点计算不是100%精确,您可能会出现表示和舍入错误。比较看看它们是否足够接近。对于涉及金钱的计算,您可能希望使用小数类型。您应该问自己的问题-我的代码是线程化的吗?时序差异影响输出有没有人使用具有副作用的表达式调用Debug.Assert()?哪些对象实现IDisposable()并以某种方式执行更改状态?您是在调用非托管代码吗?在这种情况下,3号很可能是坏男孩。垃圾收集在调试和发布时可能会有很大差异,您可能会发现当对象被垃圾收集时它会影响后续单元测试的结果。此外,如果您使用的是NUnit和TestDriven.NET,则这两个运行测试的顺序不同。通常是这种情况,因为调试版本默认没有优化,即使启用它,调试时的行为也大不相同。您可以在“属性”->“构建”选项卡上为所有程序集的项目设置禁用“优化代码”。当然,还有其他变化可能会导致差异,例如您提到的条件方法就是其中之一。我发现这些很少是问题的原因,对我来说它几乎总是优化器。优化器的一个经典问题涉及“内联”方法,这样它们就不会出现在调用堆栈中。这会导致在使用System.Diagnostics.StackFrame类确定当前执行点时出现问题。同样,这将影响MethodBase.GetCurrentMethod的结果或依赖于执行该方法的其他功能/行为。然后有很多我在优化器中看到的东西根本无法解释。一个这样的例子在一篇文章“HashDerivedBytes”中被记录和讨论-替换Rfc2898DeriveBytes,但为什么呢?“但我从来没有解开这个谜团。我所知道的是,当优化器用于生成派生字节序列时,它只是破坏了Rfc2898DeriveBytes。奇怪的是,它仅在所使用的哈希算法无法解析生成的字节时才起作用。这只会在大小可整除(20)时中断,并且只会在前20个字节后产生不正确的结果。事实上,对代码产生负面影响的优化对编译器来说并不新鲜。大多数老式的C++开发人员会立即告诉您,然后像我一样,长篇大论地讲述他们是如何解决它的;)正如Mark所说,这通常是时间相关问题的结果,通常是竞争条件或同步问题.处理此类问题的一种常见方法是在受影响的区域使用“打印”语句来向您展示发生了什么。如果打印语句(Console.WriteLine、Response.Write、logging或其他)使问题消失,将值存储在全局变量中并在问题发生后打印全局变量。最近一次发生在我身上的是从串行端口读取代码。调试活动引起的时序变化足以影响串口缓冲字节的方式,从而改变缓冲区的解析方式。由于打印语句改变了时间,我不得不将数据存储到输出中。再加上我的两分钱,我最近发现我在测试调用的sql过程中进行日期比较。这些日期都是在测试过程之前自动生成的,并且值被插入到DB中,所以偶尔它们会完全相同(使用RunTests时),导致在表连接上返回null。不是我所期望的。显然,在调试模式下,由于我正在缓慢调试,自动构建时间会有所不同,这意味着我永远不会遇到错误。只要动作之间肯定有延迟,我就通过插入Threading.Thread.Sleep(520)解决了这个问题。问题解决了。以上是C#学习教程:代码在发布模式和调试模式下表现不同。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
