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;
}
}
}