1
次のコードは、同じ出力を95%のマシンで生成しますが、いくつかの違いがあります。C#デバッグとリリースの違い
Changing from New to Fin
OK
が、リリースモードで:OK
行が欠落している
Changing from New to Fin
デバッグモードでは出力があります。プロジェクトはVS2005でビルドされた.Net 4.0を対象としています。hereフルサンプルをダウンロードできます。
ソースコード
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Status current = Values.Status;
if (current != Next())
Console.WriteLine("OK");
}
static VO Values = new VO();
private static Status Next()
{
Status res = Status.Fin;
if (Values.Status == Status.New && Values.Cond)
res = Status.Fin;
else if (Values.Status == Status.Fin)
res = Status.Fin;
Log("Changing from {0} to {1}", Values.Status, res);
Values.Status = res;
return res;
}
public static void Log(string format, params object[] args)
{
Console.WriteLine(format, args);
}
}
public class VO
{
public Status Status;
public bool Cond;
}
public enum Status { New, Fin }
}
これは私の意見では、エラーを再現する最小限のバージョンです。 Next()のいくつかの条件を削除した後、Logメソッドをインライン化し、Values.Condをfalseに置き換えると、アプリケーションは正しく動作します。
:ハードウェア関連ではありません。オペレーティングシステムがHyper-Vに抽出され、問題は解決しません。
実行ファイルをIL逆アセンブラで実行し、 'Main'にどのような違いがあるのかを確認してください。 – Abion47
私はデバッグとリリースで同じ出力を得ます – aquinas
興味深いことに、LinqPadでは、最初の実行で2行、2番目(および他のすべての結果的な実行)は 'OK'なしの最初の行のみを生成します。私が推測しているのは、それを引き起こす「静的」なのです。 – rbm