代码在发布与调试模式下的行为方式不同

Sha*_*owe 9 .net c# release

在Release模式和debug模式下运行时,我们有一些单元测试失败.如果我在发布模式下附加调试器,则测试通过.有太多的代码要在这里发布,所以我真的只是在寻找调试发布模式问题的最佳实践.我检查过:

  • DEBUG和RELEASE预处理程序指令,但我没有找到任何指令.
  • 条件方法

解决方案:在这种情况下,这是因为我在比较浮点变量是否相等.如果没有重大的重构,我无法将浮点数更改为十进制,所以我添加了一个扩展方法:

public static class FloatExtension
{
    public static bool AlmostEquals(this float f1, float f2, float precision)
    {
        return (Math.Abs(f1 - f2) <= precision);
    }

    public static bool AlmostEquals(this float f1, float f2)
    {
        return AlmostEquals(f1, f2, .00001f);
    }

    public static bool AlmostEquals(this float? f1, float? f2)
    {
        if (f1.HasValue && f2.HasValue)
        {
            return AlmostEquals(f1.Value, f2.Value);
        }
        else if (f1 == null && f2 == null)
        {
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

可能导致您看到的行为的一件事是导致竞争条件的错误.附加调试器可以更改代码的时序,从而不再触发竞争条件.

要修复它,只要有多个线程访问数据,就要适当地使用同步.


我正在比较IsEqual方法中的一些浮点值.

这听起来是一个非常糟糕的主意.您不应该将浮点数比较为相等,因为浮点计算不是100%精确,您可以获得表示和舍入错误.比较看它们是否足够接近.对于涉及金钱的计算,您可能希望使用该decimal类型.


ste*_*fan 4

由于它似乎与浮点相关,因此有很多事情可能会出错。请参阅: C# - 32 位和 64 位上的数学运算结果不一致 以及 .NET 上的双精度问题

有很多东西可以用浮点来破坏。比较浮点数是否相等是一个普遍的禁忌。您应该检查小于合理 epsilon 的差异。