18

null引数のチェックなどのガードメソッドを提供するライブラリまたはソースコードを探しています。明らかに、これは構築するのはかなり簡単ですが、.NET用の何かがすでにそこにあるかどうか疑問に思っています。基本的なグーグル検索はあまり明らかにしませんでした。

4

6 に答える 6

12

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 ブログで簡単にパッケージ化できるもう 1 つの優れたアプローチ:

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

私は自分のプロジェクトでそれを使用しており、そこからコードを借りることができます。

于 2009-08-14T10:16:27.500 に答える
8

Microsoft のCode Contractsが .NET 4.0 で発表されたことを考えると、可能であればほぼ互換性のあるものを見つけようとします。そうでない場合は、自分で作成します。そうすれば、(最終的に) .NET 4.0 にアップグレードするときに、移行がより簡単になります。

于 2008-11-18T17:24:36.670 に答える
2

使用できる方法はいくつかあります。

私のお気に入りは、アスペクト指向プログラミングを使用することです。PostSharp をチェックしてください。

C# の拡張機能である Spec# も参照してください。

4.0 では、フル機能のコントラクト ライブラリが提供されます。

最後に、私の同僚が非常に便利なガード ライブラリを思いつきました: http://blueonionsoftware.com/blog.aspx?p=ca49cb62-7ea2-43c5-96aa-91d11774fb48

于 2008-11-18T17:25:53.207 に答える
1

最近、ガード クラスに関する投稿を書きました (情報も見つかりませんでした): http://ajdotnet.wordpress.com/2009/08/01/posting-guards-guard-classes-explained/

それぞれの Guard クラスの実装も公開しました (このコードをそのまま使用するか、必要に応じて調整してください): ajdotnet.wordpress.com/guard-class/

.NET 4.0 (Spec# の後継) における Guard クラスとコード コントラクトの関係については、次の投稿を参照してください: www.leading-edge-dev.de/?p=438

(断片的なリンクで申し訳ありません。このサイトでは 1 つのリンクしか許可されていません...)

こんにちは、AJ.NET

于 2009-08-14T06:32:48.853 に答える
1

市販されているものは知りません。このタイプのコードは、パターンとプラクティスのエンタープライズ ライブラリでサポートされています。また、CodePlex で (さまざまな程度で) これを行っているように見える多くのオープン ソース プロジェクトもあります: http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=validation

ほとんどの場合、これらのタイプのライブラリは最終的にカスタム作成され、それらを使用する会社の内部にとどまります。

.NET 4.0 では、Spec# に基づくCode Contractsを使用してこれを行うメカニズムを提供するサポートが提供されます。

于 2008-11-18T17:26:57.557 に答える
0

netfx-guardnugetパッケージをインストールします。また、notnullおよびnotemptyのコードスニペットを取得し、手動チェックと同じくらい高速に実行されます

于 2012-01-31T12:40:39.350 に答える