『究極のC#プログラミング』 Chapter19 小さな改善とコンパイラの新機能
pragma warningディレクティブ
#pragma warning disable 警告番号リスト
// この間では指定した警告が無効になる
#pragma warning restore 警告番号リスト
部分メソッド定義
部分クラスと併用する
1つの部分クラスでメソッドの名前と引数だけ定義し、他の部分クラスでそのメソッドの実体を定義する
実装がない時はエラーが出ずに呼び出しごと無くなる
部分メソッドを使えば、ちょっとしたイベント処理ができる
イベントを部分メソッドの呼び出しで伝達するようにして、部分クラス間のイベント授受が可能となる
Eventを使ったイベント処理と比べて、コンパクトで効率がよい
(実装がない時は呼び出しごと無くなるので)
部分メソッドだと、コンパイル時に呼び出し先が確定してしまうので、
実行時のイベントハンドラの脱着ができず、自由度は低い
部分メソッドの制約
・voidを返す必要がある
・virtual, externにはできない
・outパラメータは使えない(refは使える)
・暗黙的にprivateになる
・部分メソッドのデリゲートは作成できない
こうした制約があるため、開発中のプログラムに対して、後から部分メソッドを使った方法に切り替えるのは難しい。
設計段階から部分メソッドが使えるように配慮しておかないと、なかなか難しい。
しかし、性能面が問題になるなら使うと価値があるかもしれない。
固定サイズバッファ
unsafeコンテキストのなかでも、外部とデータやりとりする時の型のマーシャリングは大きな問題である
例えば、C# 1.xは構造体内部に配列を埋め込めない。
なぜなら、C#の配列は独立したオブジェクトとして扱われるため、配列オブジェクトそのものではなく、配列オブジェクトへの「参照」しか埋め込めないから。
しかし、C/C++で記述されたWindows APIの中には、配列が埋め込まれた構造体が多い。
(例えば、データ名を格納する場合は、文字列を格納する配列が埋め込まれていて当たり前である)
そこで、C#2.0では固定サイズバッファが扱える。
public fixed int AnArray[100];
volatileがIntPtr, UIntPtr型に使える
volatileキーワードは、マルチスレッドプログラミングにおいて、いつ書き換わるか分からないフィールドに付加するキーワード。
しかし、一回の操作で書き換え完了しないデータの場合、書き換え途中のデータがほかのスレッドから見えてしまうことがある。
そのため、volatileキーワードは、整数型や整数ポインタのような参照型にしか使えない。