调试和发布版本中C#可能存在的不同行为

时间:2017-08-04 03:32:22

标签: c# testing compilation release compiler-optimization

在C ++中,编译器优化可能通过利用程序中的未定义行为(如有符号整数溢出和解除引用空指针)来产生“意外”程序行为。如果在生产中使用发布版本,则必须在发布版本中测试程序。

在C#中,未定义的行为很少见。在

之外的生产中使用之前,是否有更多理由在发布版本中测试程序
  1. 不安全的代码
  2. 多线程计时
  3. 启用/禁用调试/释放模式代码(例如#if)
  4. 优化可以产生不同的程序行为,比如C ++吗?

1 个答案:

答案 0 :(得分:1)

这与多线程时序有关:在发布模式下,编译器可以通过重新排列指令或用常量替换值来执行某些优化,这些优化可以改变代码的运行时行为(包括在看似正确的代码中引入无限循环)。这是关于易失性和非易失性内存读取的related question,正如Hans在评论中指出的那样,an article from The Daily WTF关于C#编译器用常量值替换变量作为优化。