『究極の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キーワードは、整数型や整数ポインタのような参照型にしか使えない。