2012-07-30 63 views
3

這是一件不是真正的問題,我很抱歉,如果這是一個愚蠢的問題,但它只是我很好奇。假設我想將字符串參數解析爲一個整數,如果該字符串不爲空,則將該整數設置爲-1。有沒有更好的方式來寫這樣一句話:C#解析值如果不爲空

int id = context.Request["Id"] == null ? -1 : int.Parse(context.Request["Id"]); 

這似乎只是凌亂有評估字符串,看它是否是空,然後再對其進行評估分析它。現在我已經想到了,如果它不爲null,那麼就會出現對象並訪問對象屬性。所以像這樣:

int id = person == null ? -1 : person.id; 

這是公認的做法?

回答

11

對於你的第一個例子中,你可以使用null coalescing operator

int id = int.Parse(context.Request["Id"] ?? "-1"); 

如果存在一個null-safe dereferencing operator但因爲它沒有在C#中存在的第二個例子可以改進,你的做法是罰款:

int id = person == null ? -1 : person.Id; 
+1

打我吧:) – Mastermnd 2012-07-30 19:47:47

+1

這確實會導致不必要的'int.Parse(「 - 1」)',但是,而不是直接將值設置爲-1。 – 2012-07-30 19:51:51

+0

我甚至沒有想過在將參數傳遞給解析方法時進行空檢查,doh!現在看起來很簡單。是的,無效的解引用操作符正是我所期待的,很高興知道它存在,而不是C#。謝謝! – BurkDiggler 2012-07-30 20:12:41

1

就個人而言,我將使這兩個語句:

string tmp = context.Request["Id"]; 
int id = String.IsNullOrWhitespace(tmp) ? -1 : int.Parse(tmp); 

這處理這個沒有任何額外的解析。在一行中執行此操作需要額外查看上下文(您試圖避免的)或額外的解析。

+1

IsNullOrWhitespace?以及其他所有不是數字的內容? int.TryParse對我來說似乎是一個更好的解決方案。 – 2012-07-30 19:58:48

+1

@WouterH是的 - 這不處理非數字輸入 - 但它更多的是試圖解決處理空值與整數解析的具體問題。 – 2012-07-30 20:02:04

2

您沒有說明int.Parse()是否有失敗的非空值的潛力,但如果你不能確定一個非空輸入字符串將永遠是一個int值,您還可以使用TryParse()方法:如果context.Request["Id"]是空

int id; 
if (!int.TryParse(context.Request["Id"], out id) 
    id = -1; 

這不會拋出異常,或者如果它不能分析到int

+0

,看起來像我的答案似乎exaclty :)看起來像我們在同一時刻打字相同的字符。 – 2012-07-30 19:56:05

+0

無論如何+1,因爲它是更好的準備非數字輸入,而不是捕捉異常。 – 2012-07-30 19:57:56