次のコードは所謂多重起動の防止のためにミューテックスを使う例ですが、リリースビルドだと意図通りに動かないことがあります。
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
bool ok;
Mutex mutex = new Mutex(true, "OreOre", out ok);
if (ok)
{
Console.WriteLine("process ok");
}
else
{
Console.WriteLine("process duplicate");
}
GC.Collect();
Console.ReadKey();
}
}
}
GC.Collect
がミューテックスを解放してしまうからですが、mutex 変数が Main のスコープにあるので Main を抜けるまでは GC されないように思いますが・・・
もっと判りやすいのが↓これ。hoge のファイナライザがスコープを抜ける前に呼ばれます。
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var hoge = new Hoge();
GC.Collect();
Console.ReadKey();
}
}
class Hoge
{
~Hoge()
{
Console.WriteLine("Hoge Finalize");
}
}
}
最適化によって次のように書き換えられるためだと思われます。
-var hoge = new Hoge();
+new Hoge();