35

あなたのクラスでガード条項の爆発を管理する際に、人々は(もしあれば)どのようなアプローチを取りますか?例えば:

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count)
{
    if (string.IsNullOrEmpty(var1))
    {
        throw new ArgumentNullException("var1");
    }

    if (items == null)
    {
        throw new ArgumentNullException("items");
    }

    if (count < 1)
    {
        throw new ArgumentOutOfRangeException("count");
    }

    ... etc ....
}

私が現在取り組んでいるプロジェクトには、パブリックメソッドに同様のガード句のセットを持つ多くのクラスがあります。

私は.NET4.0コード契約を知っていますが、これは現時点では私たちのチームのオプションではありません。

4

5 に答える 5

60

私が見た多くのプロジェクトでは、静的Guardクラスが使用されています。

public static class Guard {
    public static void ArgumentIsNotNull(object value, string argument) {
        if (value == null)
            throw new ArgumentNullException(argument);
    }
}

私の意見では、コードがずっときれいになります。

Guard.ArgumentIsNotNull(arg1, "arg1");
于 2009-10-20T23:40:52.643 に答える
4

一方、これに関する優れた記事がここにあります: http://haacked.com/archive/2013/01/05/mitigate-the-billion-dollar-mistake-with-aspects.aspx/

定型コードを削減するFodysの機能に興奮しているので、 NullGuard.Fodyの使用を検討します

于 2015-02-07T08:06:08.250 に答える
4

Introduce a Null Objectへのリファクタリングを検討するかもしれません。

于 2009-10-21T00:03:50.630 に答える
4

Code Contracts ルートをたどりたくない場合、単純化する 1 つの方法は中括弧を削除することです。

public void SomeMethod<T>(string var1, IEnumerable<T> items, int count)
{
    if (string.IsNullOrEmpty(var1))
        throw new ArgumentNullException("var1");

    if (items == null)
        throw new ArgumentNullException("items");

    if (count < 1)
        throw new ArgumentOutOfRangeException("count");

    ... etc ....
}

それ以外にも、コード コントラクトをシミュレートする方法がいくつかあります。.Net 4.0 はまだプライム タイムではないという異論がある場合は、次のようにします。

http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx

于 2009-10-20T23:35:49.930 に答える