えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

Vs2010 契約という考え方

System.Diagnostics.Contracts 名前空間が存在する。
今までの Debug.Assert から考えて一歩進んだ考え方である。
なんとコンパイル時にワーニングが出てくるのである。
しかもガード句だけではなく戻り値もオブジェクトが利用可能かも契約できる。
http://blogs.msdn.com/somasegar/archive/2009/02/23/devlabs-code-contracts-for-net.aspx

日本語訳
http://ameblo.jp/umesawaa/archive1-200903.html

INFOQ
http://www.infoq.com/jp/news/2009/03/Code-Contracts-Details

こんな使い方をすると思うのだが。
Assert と Assume の区別がわからない。
Ensures や Requires が動いてないように見える。
somasegar Blog の最後の設定画面がないので今回のベータにはある程度しか入っていないんだろう。
(コンパイル時にワーニングが出てくるとか・・・)

こうすれば使えるという情報があったら教えてください。

なにはともあれコード品質の向上にとって楽しみな技術である。

 

~~~~~~~~~~~~~~~

using System;
using System.Diagnostics.Contracts;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Requires1(false);
        }

        static private void Assert1(bool condition)
        {
            Contract.Assert(condition);
        }
        static private void Assert2(bool condition)
        {
            Contract.Assert(condition,"TEST Assert");
        }

        static private void Assume1(bool condition)
        {
            Contract.Assume(condition);
        }
        static private void Assume2(bool condition)
        {
            Contract.Assume(condition, "TEST Assume");
        }

        static private bool Ensures1(bool condition)
        {
            Contract.Ensures(Contract.Result<bool>() != false);
            return condition;
        }
        static private bool Ensures2(bool condition)
        {
            Contract.Ensures(Contract.Result<bool>() != false, "TEST Ensures");
            return condition;
        }

        static private bool EnsuresOnThrow1(bool condition)
        {
            Contract.EnsuresOnThrow<ApplicationException>(Contract.Result<bool>() != false);
            return condition;
        }
        static private bool EnsuresOnThrow2(bool condition)
        {
            Contract.EnsuresOnThrow<ApplicationException>(Contract.Result<bool>() != false, "TEST EnsuresOnThrow");
            return condition;
        }

        static private bool Requires1(bool condition)
        {
            Contract.Requires(condition != false);
            return condition;
        }
        static private bool Requires2(bool condition)
        {
            Contract.Requires(condition != false, "TEST Requires");
            return condition;
        }

        static private bool RequiresAlways1(bool condition)
        {
            Contract.RequiresAlways(condition != false);
            return condition;
        }
        static private bool RequiresAlways2(bool condition)
        {
            Contract.RequiresAlways(condition != false, "TEST RequiresAlways");
            return condition;
        }
    }
}

投稿日時 : 2009年5月24日 17:45

コメントを追加

# re: Vs2010 契約という考え方 2009/05/24 19:40 NyaRuRu

>こうすれば使えるという情報があったら教えてください。

これとか。
http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf

beta1 で未実装な部分等についても解説されています。

# re: Vs2010 契約という考え方 2009/05/24 21:03 えムナウ

このサイトからインストールしたら動きました。
http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

ベータにはある程度(クラスライブラリ)しか入っていないでインストールが必要ってことみたいです。

タイトル
名前
URL
コメント