このブログの中を検索する

2012/04/13

Code Contracts (現状のC#で非null保証をしたければ)


title: Code Contracts (現状のC#で非null保証をしたければ)
url: http://ufcpp.wordpress.com/2012/04/10/null%E9%9D%9E%E8%A8%B1%E5%AE%B9/

snippet:

-----引用-----
現状の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 件のコメント:

コメントを投稿