当前位置: 首页 > 知识库问答 >
问题:

为什么在这种特定且非常简单的情况下,Debug与Release不同?[副本]

燕照
2023-03-14

... 我所说的不同并不是指性能、调试能力等等,我指的是不同的程序(对于相同的输入,程序会给出不同的输出)。

采取以下方案:

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框架4.0起。

在调试中,输出为"TrueTrue",在发布中,输出为"TrueFalse"。

请注意,如果我在最后删除“if”部分,问题就不会再发生了。

所以我的第一个问题是:这到底是怎么回事?为什么'if'会影响程序的行为,并使调试和发布不同?

我知道调试输出与发布输出不同,但我通常期望不同之处,如性能优化、调试信息等...

我认为我应该期望在所有情况下,对于给定的输入,调试和发布程序都应该给出相同的输出。

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

我是否应该期望在所有情况下,对于给定的输入,调试和发布程序都应该给出相同的输出?

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

但我想读其他的观点?

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

共有1个答案

司马彦
2023-03-14

在调试生成或附加调试器时,GC和即时编译器的行为将更改以帮助调试。

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

 类似资料:
  • 问题内容: 来自问题的原因,或者说更确切地说,object .__new__在这两种情况下的工作方式不同 作者对为什么不感兴趣,而对如何感兴趣。 我非常想了解原因,尤其是: 为什么不打印任何参数而不是 为什么没有为testclass3引发错误?(因为除了自我之外没有其他参数) 码 问题答案: 您正在使用旧的Python版本;此错误消息已更新: Python只会抱怨既不支持又不被覆盖的参数。例如,当

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 问题内容: 我偶然发现该语句(从一些更复杂的代码中摘录)进行编译: 在短暂但快乐的时刻,我认为受检查的异常最终决定已经死亡,但是对此仍然感到遗憾: 该块不必为空;似乎可以有代码,只要该代码不引发检查异常即可。这似乎是合理的,但是我的问题是,语言规范中的哪个规则描述了此行为?据我所知,§14.18throw语句明确禁止使用它,因为表达式的类型是已检查的异常,并且不会被捕获或声明为被抛出。(?) 问题

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 输入是:1。硬币中一定数量货币的总重量,2。旧货币硬币的价值和相应重量。 目标是找到给定金额货币的最低可能货币价值。 我的方法是按货币的价值/重量比升序对硬币进行排序,然后贪婪地将第一枚硬币的重量尽可能多地匹配到总和中(跟踪它匹配的次数),然后匹配将第二枚硬币的重量尽可能多次地放入余数中,等等,对于所有硬币或直到余数为零(如果不是,情况是不可能的)。 法官说我的答案是错误的。你能给我一个关于算法错

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数