2011-08-13 4 views
17

私はCode Contractsを使い始めていますが、Contract.Requiresはかなり簡単ですが、私はEnsuresが実際に何をしているのか分かりません。Contract.Ensuresはどのように機能しますか?

私はこのような単純な方法で作成しようとしました:私は「間違った」のメッセージを見ることはない、またそれは例外または何かを投げるん

static void Main() 
{ 
    DoSomething(); 
} 

private static void DoSomething() 
{ 
    Contract.Ensures(false, "wrong"); 
    Console.WriteLine("Something"); 
} 

を。

これは実際に何をしていますか?

+1

コンソールに何かを書き込んだ後で、未処理の例外 'ContractException'が発生しました。「事後条件が失敗しました:間違っています」。それは良い作品のように見えます。 –

+0

静的証明者は、コード契約の背後にある実際の価値ですが、この特定の条件は分析的には非常に奇妙です。これは、「この陳述が間違っている」という真実を証明するように人に頼むこととほぼ同じです。 –

+2

偽の部分は、単にそれが引き起こされたことを確認することに過ぎませんでした:-) – Steffen

答えて

20

の場合は、適切な設定でリライタツールを実行しています。私の推測では、あなたは事後条件をチェックしないモードで走っているということです。

紛らわしいものを約Contract.Ensuresあなたがメソッドの開始時ににそれを書くということですが、それは、メソッドの最後にを実行します。リライタは、すべての魔法を実行して適切に実行され、必要に応じて戻り値が与えられます。

コード契約に関する多くの点と同様に、私はリライターツールの結果でリフレクターを実行することをお勧めします。あなたが正しい設定を持っていることを確認してから、リライタが何をしたのかを考えてください。


編集:私は、私はまだContact.Ensuresポイントを表明していない実現。簡単に言えば、メソッドが最終的に何かを行ったことを確認することです。たとえば、リストに何かが追加されているか、戻り値がnullでないか、または何かであることが保証されます。たとえば、あなたが持つかもしれない:書き換えコードで

public int IncrementByRandomAmount(int input) 
{ 
    // We can't do anything if we're given int.MaxValue 
    Contract.Requires(input < int.MaxValue); 
    Contract.Ensures(Contract.Result<int>() > input); 

    // Do stuff here to compute output 
    return output; 
} 

を、返される値本当にが入力より大きいことを保証するために、リターンの時点でチェックがあるでしょう。

+0

あなたはそうだった - プロジェクト設定でモードが正しく設定されていませんでした。私の部分で愚かな間違い:-) – Steffen

+2

@ステファン:それが意味するものを明確にするためにもう少しを追加しました。あなたがそれを必要としているかどうかは分かりませんが、おそらく将来の読者が役に立つと思うかもしれません:) –

+0

それはかなり期待していましたが、書くことでいつもいいですね:-) – Steffen

関連する問題