在这个特定且非常简单的情况下,为什么Debug与Release不同?

时间:2015-12-10 17:48:34

标签: c# .net visual-studio debugging language-design

......不同的我不是表现性能,调试能力糖果等等,我的意思是不同的程序(同一输入的程序提供不同的输出)。

采取以下计划:

static void Main()
{
            object obj = new object();
            WeakReference objRef = new WeakReference(obj);

            Console.Write(objRef.IsAlive);

            obj = null;
            GC.Collect();

            Console.Write(objRef.IsAlive);

            if (objRef.IsAlive)
            {

            }
            else
            {

            }
}

上面的程序在.Net framework 4.0以后的调试模式和发布模式中给出了不同的结果。

在Debug中,输出为" TrueTrue"在Release中,输出为" TrueFalse"。

请注意,如果我删除了' if'最后,问题不再发生了。

所以我的第一个问题是:这里发生了什么?为什么'如果'会影响程序的行为并使Debug和Release不同吗?

我知道Debug输出与Release输出不同,但我通常会预期性能优化,调试信息等差异......

我认为我应该期望在给定输入的所有情况下,Debug和Release程序都应该提供相同的输出。

为了不做任何假设,让我将前一句作为我的第二个问题:

我是否期望在给定输入的所有情况下,Debug和Release程序都应该提供相同的输出?

显然第二个问题的答案是否定的,所以我已经制定了一个反例的程序。但是对我来说听起来非常奇怪,一个程序是在语言之外指定的(通过其他方式)。也就是说,从一个独特的C#源我可以获得不同的程序,即执行不同的程序。

但我想阅读其他意见?

编辑:还要注意IsAlive是一个属性,所以不应该有副作用。

1 个答案:

答案 0 :(得分:2)

在调试版本中或附加了调试器时,GC和JIT编译器的行为会发生变化,以帮助调试。

如果您的代码对GC或JIT优化有0依赖性,那么在调试和发布中您将具有相同的行为。但是,如果您的代码依赖于GC行为(如使用WeakReference)或JIT优化(我能想到的最大的一个是处理多线程环境中的非易失性变量),您可能会根据方式获得不同的行为它是建立的,或者是否附加了调试器。