2012-01-10 69 views
1

我正在尋找在C#中表達了以下測試的更簡潔的方式,其中x是一個可空INT試圖儘可能地與C#

英語爲簡潔: 如果x的值和Y> X然後做一些

C#,使更簡潔:

if(x.HasValue && y > x) 

類似地,如果我想默認爲null的布爾值(X)爲假我可能會寫:

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

代替:

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

非常感謝

+6

提升的比較運算符被定義爲返回false,如果任一操作數爲null。您不需要檢查操作數是否具有值。有關詳細信息,請參閱C#4規範的第7.3.7節。 – 2012-01-10 23:24:29

+1

「if(x.HasValue && y> x)」可能與其應該一樣簡潔。在某些情況下,更簡化是不切實際的,並且在某些情況下會使代碼不易讀。 – 2012-01-10 23:24:50

回答

3

if(x.HasValue && y > x)是非常簡潔的,因爲它是,更不用說明確。變通辦法會有點人爲的做法。試想一下:

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

由於PST筆記,你實際上並不需要HasValue來電來訪。但是爲了清晰起見,儘管如此,也可能是一個好主意。

11

y > x應該是足夠的。

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

(OTOH,我已經被這種行爲,我以爲事情會是空「比大」咬傷。在這種情況下,y > (x ?? 0)或類似的可能是有用的。)

從本·福格特的評論Using Nullable Types

當您使用可空類型進行比較,如果可空類型之一的值是零,而另一個則不然,所有的比較評估,除了虛假=(!不等於)。重要的是不要假設因爲特定的比較返回false,相反的情況返回true。

快樂編碼。

+4

這裏是[文檔](http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx)的重要部分:「當您使用可空類型執行比較時,如果其中一個可空類型是空的,另一個不是,除了'!='(不等於)「以外,所有比較的結果都爲false。」 – 2012-01-10 23:24:27

+0

@BenVoigt感謝您的參考。我已經更新了答案以反映。 – 2012-01-10 23:30:03

3

雖然可能有一種方法使聲明更簡潔,但我會避開它。您展示的用法非常習慣,並使您的意圖清晰。依賴可空的不等式運算符的行爲(如在@ pst的答案中)可能會導致對代碼的誤解,並淡化變量可爲空的事實。我會堅持你擁有的。

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())