2012-01-10 3 views
1

とできるだけ簡潔になろうとしています。x値とy> Xを持っている場合 その後、より簡潔にするために何かを私は、xがNULL可能int型</p> <p>英語ですC#で次のテストを表現するより簡潔な方法を探していますC#

C#の操作を行います。

if(x.HasValue && y > x) 

同様に、私はNULL可能ブール値をデフォルトしたい場合(x)はfalseに私が書くかもしれない:

if(x ?? false) 
{ 
    //x is true 
} 
else 
{ 
    //x is either null or false 
} 

代わりに:それは明確に言及しないように、あるよう

if(x.HasValue() && x == true) 

感謝

+6

持ち上げられた比較演算子は、どちらかのオペランドがnullの場合にfalseを返すものとして定義されています。オペランドに値があるかどうかを確認する必要はありません。詳細は、C#4仕様のセクション7.3.7を参照してください。 –

+1

"if(x.HasValue && y> x)"はおそらくそれほど簡潔ではありません。特定の点では、より単純化は実用的ではなく、場合によってはコードの読みやすさを低下させる可能性があります。 –

答えて

3

if(x.HasValue && y > x)はかなり簡潔です。回避策には多少の工夫が必要です。考えてみましょう:PSTノートとして

if ((x ?? (y + 1)) < y) 

、あなたは実際にここにHasValueコールは必要ありません。しかし、分かりやすくするために、それにもかかわらず、それを含めることは良い考えかもしれません。

11

y > xで十分です。

0 >= (int?)null // false 
0 <= (int?)null // false 

(大藤、私は何かがnullの「より大」だろうと思ったこの行動にかまされている。これらのケースでは、y > (x ?? 0)または類似が役に立つかもしれません。)

にベンフォークトさんのコメントから、 Using Nullable Types

NULL可能タイプのいずれかの値がnullで、他ではない場合は、すべての比較を除いfalseに評価し、NULL可能なタイプ、との比較を行います=(!等しくない)。特定の比較がfalseを返すため、逆の場合はtrueを返すと想定しないことが重要です。

ハッピーコーディング。

+4

[ドキュメント](http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx)の重要な部分は次のとおりです。「null可能な型との比較を実行する場合、NULL可能型のいずれかの値もう一方はNULLではなく、 '!='(等しくない)以外のすべての比較はfalseと評価されます。 –

+0

@BenVoigt参考に感謝します。私は反映する答えを更新しました。 –

3

ステートメントをより簡潔にする方法があるかもしれませんが、私はそれを明確にします。あなたが見せてくれる使い方はかなり慣れており、あなたの意図がはっきりしています。 null可能な不等式演算子の動作(@ pstの答えのような)に依存すると、コードの誤解を招くだけでなく、変数がnullableであるという事実を無視することができます。私はあなたが持っているものに固執します。

1

拡張メソッドを使用できます。

public static class IntegerExtensions 
{ 
    public static bool IsLargerThan(this int? number, int numberToCompare) 
    { 
     return number.HasValue && number > numberToCompare; 
    } 
} 

... 

// Usage: 

int? val1 = 15; 
int val2 = 10; 

if (val1.IsLargerThan(val2)) 
{ 
    // Do Something 
} 
0

GetValueOrDefault()メソッドを試しましたか?

xがint?の場合、最初のif文はif (x.GetValueOrDefault() > y)と書き直すことができます。 xがbool?の場合は、単にif(x.GetValueOrDefault())と書き直すことができます。

関連する問題