title: Code Contracts (現状のC#で非null保証をしたければ)
url: http://ufcpp.wordpress.com/2012/04/10/null%E9%9D%9E%E8%A8%B1%E5%AE%B9/
-----引用-----
現状のC#で非null保証をしたければ、Code Contractsというのを使って、契約プログラミングします。Contractクラス(System.Diagnostics.Contracts名前空間)を使って、契約表明できます。
public static T Parse(string s)
{
Contract.Requires(s != null);
Contract.Ensures(Contract.Result<T>() != null);
return new T(); // 仮実装
}
これで、Parseメソッドがnullを返さないことを保証します。
このRequiresやEnsuresメソッドは、実際には何もしない
Conditional属性が付いていて、コンパイル後に消える
静的検証
- Visual Studio 2010に関しては、Code Contractsの別途インストールが必要
- 有償エディションにしか入らなかったはず
- その上で、コード解析オプションをOnにしないと働かない
- 静的コード解析、そこそこ時間がかかる
- 静的解析しきれない部分を検証するために、動的検証コードを入れるオプションもある
- 契約の表明はあくまで自己申告なので、やろうと思えば虚偽申告できる
- Code Contractsに対応していないライブラリを使うと、必然的に何らかの動的検証が必要
- この場合、(C#のコンパイル結果の)ILコードを書き換えて、検証コードを埋め込んでる
- 契約違反は実行時例外発生
- もちろん、検証コード分、実行時の負担になる
- ちなみに、.NETの標準ライブラリには、.NET 4から、Code Contractsによる契約が表明されています。また、書いた契約をドキュメントに反映する仕組みも持っています。
0 件のコメント:
コメントを投稿