2013-05-10 20 views
0

我不喜歡我每次使用CIntInteger.Parse(我知道的是昂貴的)時間做這樣的事情:如果整數/雙重強制轉換失敗,默認爲0的最佳方法是什麼?

Try 
    someIntVariable = CInt(someStringVariable) 
Catch ex As Exception 
    someIntVariable = 0 
End Try 

而且我不喜歡參與Integer.TryParse的所有代碼行。我想我可以創建一個具有類似的功能:

Function ToInteger(str As String) As Integer 
    Dim number As Integer 
    Int32.TryParse(str, number) 
    Return number 
End Function 

但不是已經有一個擴展方法或東西內置到.NET可以在一個更優雅的方式做到這一點對我來說(沿行Nullable(Of T).GetValueOrDefault)?

+0

你可能想看看這個帖子:[Integer.TryParse - 更好的方法?](http://stackoverflow.com/questions/419027/integer-tryparse-a-better-way)。 TryParse不會拋出異常,因此工作速度更快。 – Artemix 2013-05-10 14:46:50

+0

嗯。也許檢查['TryParse']的文檔(http://msdn.microsoft.com/en-us/library/f02979c7.aspx):「* result * ...當此方法返回...如果轉換爲零失敗「 - 這聽起來像它已經是你想要的功能。 ('Double.TryParse'類似地定義爲在失敗時返回零) – 2013-05-10 14:50:20

+1

由於'0'是'Integer'的默認值,因此您可以忽略整個方法中的If/Else'塊,因爲當轉換失敗,'TryCast'將'number'設置爲'0'。 – sloth 2013-05-10 14:51:49

回答

6

老實說Integer.TryParse是要走的路,但是如果你不喜歡語法,你可以將它隱藏在擴展方法的後面。

Public Module IntegerExtensions 
    <Extension()> _ 
    Public Function AsIntOrDefault(ByVal valueToParse As String, Optional ByVal defaultValue As Integer = 0) As Integer 
     Dim retVal As Integer = 0 

     If Not Integer.TryParse(valueToParse, retVal) Then 
      retVal = defaultValue 
     End If 

     Return retVal 
    End Function 
End Module 

然後可以使用這樣的:

Public Class Foo 
    Public Sub Blah() 
     Dim value1 As Integer = "IWillNotParse".AsIntOrDefault() 'Should be 0 
     Dim value2 As Integer = "IWillNotParse".AsIntOrDefault(5) 'Should be 5 
     Dim value3 As Integer = "123".AsIntOrDefault() 'Should be 123 
    End Sub 
End Class 
+0

+1良好的擴展方法,它只是使用'TryParse'並隱藏它。 ...似乎是OP想要的...... – Matthew 2013-05-10 15:33:24

+0

+1 - 添加xml註釋以改善 – dbasnett 2013-05-10 15:37:57

+1

您不需要If Not語句。請參閱我的回答。 – 2013-05-10 22:52:25

0

試用Integer.TryParse(String, Integer)

你傳遞你想解析字符串,和整數要存儲的結果。

TryParse返回一個布爾用解析是成功還是失敗。所以你可以做

If Not Integer.TryParse(myNonInt, DestinationInt) 
    DestinationInt = 0 
End If 

如果解析成功,該值自動存儲在DestinationInt

+0

+1不確定爲什麼你是downvoted,除非沒有必要設置值,如果它失敗,整數已經默認爲零。 – Matthew 2013-05-10 15:13:39

5

如果你不需要,你不應該使用try/catch。拋出異常涉及很多開銷。

相反,你可以簡單地使用此代碼(如果沒有/結束,如果語句)

Dim value As Integer = 0 
Int32.TryParse(stringValue, value) 

如果字符串語法分析,那麼你將有值,否則爲0

+0

沒有人讀到這個問題。正如我所說的,我不想使用TryParse。它的實現對於這個目的感覺很難。我會寫我自己的擴展方法。 – Daniel 2013-05-10 14:55:04

+3

TryParse怎麼樣?它存在於你描述的確切問題中! – 2013-05-10 14:56:22

+0

那麼您的擴展方法將如何工作?用try/catch或TryParse? – 2013-05-10 14:57:23

1

這也許能爲你工作..

Function ToInteger(str As String) As Integer 
    Dim number As Integer 
    If IsNumeric(str) Then 
     number = CInt(str) 
    Else 
     number = 0 
    End If 
    Return number 
End Function 
+0

'IsNumeric'是一箇舊的VB6功能,它仍然支持.NET,但主要是爲了向後兼容。儘可能避免這些方法是最好的。另外,由於其他原因,CInt可能會失敗。例如,它可能是數字,但數字可能太大而無法將其轉換爲「整數」。 – 2013-05-10 16:46:16

相關問題