95

私はプロジェクトに取り組んでおり、多くの場所で次のことをチェックしています。

if(item.Rate == 0 || item.Rate == null) { }

何よりも好奇心として、両方のケースをチェックするための最良の方法は何ですか?

次のようなヘルパーメソッドを追加しました。

public static bool nz(object obj)
{
    var parsedInt = 0;
    var parsed = int.TryParse(obj.ToString(), out parsedInt);
    return IsNull(obj) || (parsed && parsedInt == 0);
}

もっと良い方法はありますか?

4

13 に答える 13

176

好きif ((item.Rate ?? 0) == 0) { }

アップデート1:

次のような拡張メソッドを定義することもできます。

public static bool IsNullOrValue(this double? value, double valueToCheck)
{
    return (value??valueToCheck) == valueToCheck;
}

そして、次のように使用します。

if(item.IsNullOrValue(0)){} //しかし、あなたはそれから多くを得ることができません

于 2009-03-11T04:08:26.587 に答える
46

私は受け入れられた答えがとても好きですが、完全を期すために、このオプションも言及されるべきだと思います:

if (item.Rate.GetValueOrDefault() == 0) { }

このソリューション


¹ただし、これらの種類のマイクロ最適化が違いを生む可能性は低いため、これが決定に影響を与えることはありません。

于 2013-03-15T13:32:36.250 に答える
44

ジェネリックの使用:

static bool IsNullOrDefault<T>(T value)
{
    return object.Equals(value, default(T));
}

//...
double d = 0;
IsNullOrDefault(d); // true
MyClass c = null;
IsNullOrDefault(c); // true

参照型Tの場合は( )と比較されます。それ以外の場合は、doubleとしましょう。valuenulldefault(T)Tvalue typedefault(t)false'\0'

于 2009-03-11T04:39:24.470 に答える
19

これは、ジェネリックのみを使用した Freddy Rios の受け入れられた回答の拡張にすぎません。

public static bool IsNullOrDefault<T>(this Nullable<T> value) where T : struct
{
    return default(T).Equals( value.GetValueOrDefault() );
}

public static bool IsValue<T>(this Nullable<T> value, T valueToCheck) where T : struct
{
    return valueToCheck.Equals((value ?? valueToCheck));
}

値型または構造体のいずれかを扱っているため、null の default(T) をチェックする必要がないことに注意してください。これは、T valueToCheck が null ではないと安全に想定できることも意味します。ここでTを覚えていますか?は省略形の Nullable<T> であるため、Nullable<T> に拡張子を追加することで、int?、double?、bool? でメソッドを取得します。等

例:

double? x = null;
x.IsNullOrDefault(); //true

int? y = 3;
y.IsNullOrDefault(); //false

bool? z = false;
z.IsNullOrDefault(); //true
于 2009-03-11T06:13:17.660 に答える
2

??を使用することに同意します オペレーター。

文字列を扱っている場合は、if(String.IsNullOrEmpty(myStr))を使用します

于 2009-03-11T04:11:29.123 に答える
2

コードサンプルは失敗します。objがnullの場合、obj.ToString()はnull参照例外になります。プロセスをショートカットして、ヘルパー関数の開始時にnullobjをチェックします。あなたの実際の質問に関して、あなたがヌルまたはゼロをチェックしているタイプは何ですか?文字列には素晴らしいIsNullOrEmpty関数がありますが、これはintにIsNullOrZeroメソッドを実装するための拡張メソッドの優れた使用法だと思いますか?タイプ。

編集:覚えておいてください、「?」はINullable型の単なるコンパイラシュガーであるため、おそらくINullableをparmとして取得し、それをnull(parm == null)と比較し、nullでない場合はゼロと比較します。

于 2009-03-11T04:14:47.617 に答える
2

より良い方法はありますか?

もっと良い方法を本当に探しているなら、Rate の上に抽象化の別のレイヤーを追加することができます。Nullable Design Pattern を使用して思いついたものを次に示します。

システムを使用する;
System.Collections.Generic の使用;

名前空間 NullObjectPatternTest
{
    公開授業 プログラム
    {
        public static void Main(string[] args)
        {
            var items = 新しいリスト
                            {
                                new Item(RateFactory.Create(20)),
                                new Item(RateFactory.Create(null))
                            };

            PrintPricesForItems(アイテム);
        }

        private static void PrintPricesForItems(IEnumerable items)
        {
            foreach (var item in items)
                Console.WriteLine("商品価格: {0:C}", item.GetPrice());
        }
    }

    パブリック抽象クラス ItemBase
    {
        公共の要約 レート レート { get; }
        public int GetPrice()
        {
            // Rate == 0 または Rate == null かどうかを確認する必要はありません
            return 1 * Rate.Value;
        }
    }

    パブリック クラス Item : ItemBase
    {
        プライベート読み取り専用 Rate _Rate;
        パブリック オーバーライド レート レート { get { return _Rate; } }
        public Item(Rate rate) { _Rate = rate; }
    }

    パブリック シール クラス RateFactory
    {
        public static Rate Create(int? rateValue)
        {
            if (!rateValue || rateValue == 0)
                新しい NullRate() を返します。
            新しいレート(レート値)を返します。
        }
    }

    公開クラス料金
    {
        public int 値 { get; 設定; }
        public virtual bool HasValue { get { return (Value > 0); } }
        public Rate(int value) { 値 = 値; }
    }

    public class NullRate : レート
    {
        public override bool HasValue { get { return false; } }
        public NullRate() : base(0) { }
    }
}
于 2009-03-11T04:50:11.730 に答える
0
public static bool nz(object obj)
{
    return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType()));
}
于 2009-03-11T04:11:23.773 に答える
0

文字列の場合、いつでも使用できることを忘れないでください:

String.IsNullOrEmpty(str)

それ以外の:

str==null || str==""
于 2009-03-11T05:14:16.117 に答える
-1

Joshua Shannonの素敵な答えからさらに一歩。ボックス化/ボックス化解除を防止するようになりました:

public static class NullableEx
{
    public static bool IsNullOrDefault<T>(this T? value)
        where T : struct
    {
        return EqualityComparer<T>.Default.Equals(value.GetValueOrDefault(), default(T));
    }
}
于 2018-10-19T07:37:31.307 に答える