質問
null引数のチェックなどのガードメソッドを提供するライブラリまたはソースコードを探しています。明らかにこれはかなり簡単に構築できますが、.NET向けの製品が既にあるのではないかと思っています。基本的なGoogle検索では、あまり明らかにはなりませんでした。
解決
CuttingEdge.Conditions があります。ページからの使用例:
public ICollection GetData(Nullable<int> id, string xml, ICollection col)
{
// Check all preconditions:
id.Requires("id")
.IsNotNull() // throws ArgumentNullException on failure
.IsInRange(1, 999) // ArgumentOutOfRangeException on failure
.IsNotEqualTo(128); // throws ArgumentException on failure
xml.Requires("xml")
.StartsWith("<data>") // throws ArgumentException on failure
.EndsWith("</data>"); // throws ArgumentException on failure
col.Requires("col")
.IsNotNull() // throws ArgumentNullException on failure
.IsEmpty(); // throws ArgumentException on failure
// Do some work
// Example: Call a method that should not return null
object result = BuildResults(xml, col);
// Check all postconditions:
result.Ensures("result")
.IsOfType(typeof(ICollection)); // throws PostconditionException on failure
return (ICollection)result;
}
別の優れたアプローチは、ライブラリにパッケージ化されていませんが、簡単に実行できます。 Paint.Netブログ:
public static void Copy<T>(T[] dst, long dstOffset, T[] src, long srcOffset, long length)
{
Validate.Begin()
.IsNotNull(dst, "dst")
.IsNotNull(src, "src")
.Check()
.IsPositive(length)
.IsIndexInRange(dst, dstOffset, "dstOffset")
.IsIndexInRange(dst, dstOffset + length, "dstOffset + length")
.IsIndexInRange(src, srcOffset, "srcOffset")
.IsIndexInRange(src, srcOffset + length, "srcOffset + length")
.Check();
for (int di = dstOffset; di < dstOffset + length; ++di)
dst[di] = src[di - dstOffset + srcOffset];
}
私のプロジェクトで使用し、そこからコードを借りることができます。
他のヒント
Microsoftのコードコントラクトが.NET 4.0でリリースされた場合、主に可能な場合は互換性があり、そうでない場合は自分で作成します。そうすれば、.NET 4.0にアップグレードすると(最終的に)移行が容易になります。
使用できる方法はいくつかあります。
私のお気に入りは、アスペクト指向プログラミングの使用です。 PostSharpをご覧ください。
C#の拡張機能であるSpec#もご覧ください
4.0では、フル機能のコントラクトライブラリが作成されます。
最後に、私の同僚が非常に便利なガードライブラリを作成しました。 http://blueonionsoftware.com/blog.aspx?p= ca49cb62-7ea2-43c5-96aa-91d11774fb48
市販されているものは知りません。パターン&amp;でこのタイプのコードをサポートしています。エンタープライズライブラリを実践します。 CodePlexでも同様に(程度は異なるが)これを行うように見える多くのオープンソースプロジェクトがあります。 http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation 。
ほとんどの場合、これらのタイプのライブラリはカスタム作成され、それらを使用する会社の内部に留まります。
コードコントラクトを使用してこれを行うメカニズムを提供するために、.NET 4.0でサポートが提供されます。仕様番号に基づいています。
最近、ガードクラスに関する投稿を書きました(情報も見つかりませんでした): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/
それぞれのGuardクラスの実装も公開しました(このコードをそのまま使用するか、ニーズに合わせて調整してください):ajdotnet.wordpress.com/guard-class /
.NET 4.0のGuardクラスとコードコントラクト(Spec#の後継)の関係については、次の投稿をご覧ください:www.leading-edge-dev.de/?p=438
(断片化されたリンクについては申し訳ありませんが、サイトは1つのリンクしか許可していません...)
こんにちは、 AJ.NET
netfx-guard nugetパッケージをインストールします。また、コードスニペットnotnullおよびnotemptyを取得し、手動チェックと同じ速さで実行します