String型の、Nullまたは、Emptyを比較する際、.NET Framework 2.0 の便利なメソッド
として、
String.IsNullOrEmpty() が新しくできました。
コード量が圧倒的に少なくなる、かつ、見逃しがちな処理をやってくれるため、
積極的に使っているコードなのですが、バグがあるようです。
◆追記 2009.2.21
(以下はすでに古い情報です。ご参考までにのこしておきます。)
String.IsNullOrEmpty を使っているコードは対策必須です。
■再現方法(フレームワークのバグですので、VBでも、C#でも発生します)
(1) 以下のコードを書く(コンソールアプリケーション)
static void Main(string[] args)
{
Console.WriteLine("starting");
test(null);
Console.WriteLine("finished");
Console.ReadLine();
}
static void test(string x)
{
for (int j = 0; j < 10; j++)
{
if (String.IsNullOrEmpty(x))
{
//TODO:
}
}
}
(2) コードの最適化をONにする(デフォルトでON)
(VBの場合は、詳細コンパイルオプション -> 最適化を有効にするをON (デフォルトでON))
(3) 完成した exe を直接実行する。(Visual Studio 経由だと発生しない)
実行結果
アプリケーションがクラッシュします。
なお、イベントビュアーの Application エラーログが出力されます。(なんとか確認できますね。)
■回避方法
(1) String.IsNullOrEmpty() の代わりのメソッドを作成して、呼ぶ
using System.Runtime.CompilerServices;
static void Main(string[] args)
{
Console.WriteLine("starting");
test(null);
Console.WriteLine("finished");
Console.ReadLine();
}
static void test(string x)
{
for (int j = 0; j < 10; j++)
{
//if (String.IsNullOrEmpty(x))
if (IsNullOrEmpty(x))
{
//TODO:
}
}
}
///
/// String.IsNullOrEmpty の立替メソッド
///
/// http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=113102
[MethodImpl(MethodImplOptions.NoInlining)]
public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return value.Length == 0;
}
return true;
}
なお、ASP.NET 2.0については調べていません・・・。
そもそも、リリースビルドという概念もないしー。