2012-11-21 68 views
1

是VB.NET 2005中,有沒有辦法執行以下操作,而不會拋出invalid cast exception試圖將空字符串轉換爲整數?如何避免評估所有'iif'表達?

Dim strInput As String = String.Empty 
Dim intResult As Integer = IIf(IsNumeric(strInput), CInt(strInput), 100) 
+0

我會說你的'IsNumeric'方法應該爲空字符串返回false。但是你爲什麼要檢查'strInput'然後使用'str'? –

+0

你不能 - 'IIf'不是一個表達式,而是一個函數,所以它必須在執行之前先評估所有參數。 –

+0

@JoelEtherton:對不起,只是一個錯字。它確實返回false,但它引發了一個異常,我認爲它是因爲它試圖評估整個表達式。 – CJ7

回答

8

VB.NET現在有一個真正的三元運營商(2008年以後)

Dim intResult = If(IsNumeric(strInput), CInt(strInput), 100) 

這不同於IIF因爲它使用了短路的評價。
如果測試表達式的值爲true,則FalsePart只是忽略或反之亦然

正如剛纔馬立克Kembrowsky說,在其評論中,IIF是一個函數及其參數都計算被傳遞,而如果說之前(如三元運算符)是VB編譯器的附加功能。

但是,我不喜歡在VB.NET中編程時使用Microsoft.VisualBasic兼容命名空間提供的快捷方式。該框架提供了更好的解決方案,如TryParse方法集。如果輸入字符串超過Integer.MaxValue,那麼您的示例將失敗。

一個更好的辦法可能是

Dim d As decimal 
if Not Decimal.TryParse(strInput, d) then d = 100 

,或者,如果你有一個浮點string(?OK OK,你明白我的意思)

Dim d As Double 
if Not Double.TryParse(strInput, d) then d = 100 
+1

您對使用VisualBasic命名空間有什麼主要異議? – CJ7

+0

主要是個人喜好,我希望切斷與VB6的所有聯繫,然後麻煩分發Microsoft.VisualBasic.dll(實際上我沒有從1.1時間檢查,也許沒有必要分發它) – Steve

1

如果解決方案工作......但IsNumeric()不是正確的檢查。如果strInput是一個數字,但超過integer.maxvalue,該怎麼辦?更好地使用TryParse來代替。

Dim i As Integer 
If Not Integer.TryParse("1234567890", i) Then i = 100 

Dim j As Integer = If(Integer.TryParse("123456789", Nothing), Integer.Parse("123456789"), 100) 
+0

+1好點,但應該避免第二個例子(在我看來) – Steve

+0

不應該用正確的類型聲明「i」嗎? – CJ7

+0

CJ7:整數是正確的類型(對於整數)。在我的示例中,我只用「1234567890」代替了StrInput。 @Steve:OP的原始代碼是單行的,所以也許他更喜歡這種風格。 – igrimpe

0

一種方式圓的問題是:

Dim strInput As String = String.Empty 
Dim intResult As Integer = IIf(IsNumeric(strInput), strInput, 100) 

這樣的鑄造隱式進行,沒有任何無效的轉換異常的機會。

+0

你正在分配一個字符串到一個整數,並希望最好的... – igrimpe

+0

@igrimpe:一個字符串已通過'IsNumeric'測試 – CJ7

+0

測試此項:「123456789123456789」。它是否通過IsNumeric? – igrimpe