【C#】【VisualStudio】デバッグビルド / リリースビルド

■ リリース/デバッグビルドの違い

https://msdn.microsoft.com/ja-jp/library/dykf6bx9.aspx
より、大きな違いは下記4点。

[1] ヒープ レイアウト
[2] コンパイル
[3] ポインター サポート
[4] 最適化

[1] ヒープ レイアウト

 * デバッグでは動作するがリリースではエラーとなる原因の約 90% を占める
 * 以下、体験談。
http://blog.techlab-xe.net/archives/1698

[2] コンパイル

 * ASSERT マクロはリリース ビルドでは評価されず、実行されない

[3] ポインター サポート

 * リリース ビルドでは、不正なポインターが、デバッグ情報ではなく
   初期化されていないメモリを指す可能性がある

[4] 最適化

 * 最適化は、特定のコード セグメントの内容に応じて、予期しないコードを生成することがある
  => これがリリース ビルドの問題を引き起こすことはまれですが、問題が発生する場合もある
https://msdn.microsoft.com/ja-jp/library/xz7ttk5s.aspx
より

 * 最適化したコードをコンパイルすると、新たに警告メッセージが表示されることがあり、
   これらの警告をよく確認すると、最適化に関する多くの問題を回避できる
 * 高速化のためにプログラムを最適化した結果、逆に速度が遅くなることもある(★これは知らなんだ★)
  => 最適化の方法によってはコード サイズが大きくなる
     【例】関数をインライン展開すると関数呼び出しのオーバーヘッドはなるが、
           インライン展開するコードが多すぎるとプログラムのサイズが大きくなり、
           仮想メモリのページ フォールトの回数が増える

デバッグ時にのみ実行する

[1] 条件付きコンパイル・ディレクティブ(#ifディレクティブ)を使う方法

#if DEBUG
    // 何らかの文(リリースビルドでは実行されない)
#endif

[2] Conditional属性を使う方法

[Conditional("DEBUG")] 
public void Xxxx() 
{ 
    // 何らかの文(リリースビルドでは、このメソッド自体実行されない)
}

[3] Debugger.IsAttached を使う

if (System.Diagnostics.Debugger.IsAttached)
{
  // デバッガ:ON
}
else
{
  // デバッガ:OFF
}

参考文献

http://www.atmarkit.co.jp/fdotnet/dotnettips/246debugonly/debugonly.html
[3] Debugger.IsAttached を使う
http://www.atmarkit.co.jp/fdotnet/dotnettips/948debuggerattach/debuggerattach.html

■ リリース/デバッグビルドを切り替える

1) [ツール]-[オプション]のダイアログの左下隅の「すべての設定を表示」をチェック
2)「プロジェクトおよびソリューション」をクリック
3)「ビルド構成の詳細を表示」をチェック

関連記事

メモリ領域 ~静的領域 / スタック領域 / ヒープ領域 ~

ヒープについては、以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/34569082.html