String型の、Nullまたは、Emptyを比較する際、.NET Framework 2.0 の便利なメソッド
として、
 String.IsNullOrEmpty() が新しくできました。
コード量が圧倒的に少なくなる、かつ、見逃しがちな処理をやってくれるため、
積極的に使っているコードなのですが、バグがあるようです。

◆追記 2009.2.21
 T.Hirase さんより情報いただきました。(ありがとうございます。)
.NET Framework 2.0 SP1 (2007-11-19 Release) で修正されています。
http://support.microsoft.com/kb/945757/ja

(以下はすでに古い情報です。ご参考までにのこしておきます。)
 
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;

}

 

■その他情報
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=113102
で、開発側がバグと認識していますが、
Visual Studioの次のバージョン(.NET Framework 3.5) で、対策する
といっています。


なお、ASP.NET 2.0については調べていません・・・。
そもそも、リリースビルドという概念もないしー。