......不同的我不是表现性能,调试能力糖果等等,我的意思是不同的程序(同一输入的程序提供不同的输出)。
采取以下计划:
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是一个属性,所以不应该有副作用。
答案 0 :(得分:2)
在调试版本中或附加了调试器时,GC和JIT编译器的行为会发生变化,以帮助调试。
如果您的代码对GC或JIT优化有0依赖性,那么在调试和发布中您将具有相同的行为。但是,如果您的代码依赖于GC行为(如使用WeakReference
)或JIT优化(我能想到的最大的一个是处理多线程环境中的非易失性变量),您可能会根据方式获得不同的行为它是建立的,或者是否附加了调试器。