3

我希望安全地将对象从外部缓存转换为 Integer 类型。

我似乎可以这样做的唯一方法是在 try catch 块中,如下所示:

Try
    Return Convert.ToInt32(obj)
Catch
    'do nothing
End Try

我讨厌写这样的 catch 语句。

有没有更好的办法?

我努力了:

TryCast(Object, Int32)

不起作用(必须是引用类型)

Int32.TryParse(Object, result)

不起作用(必须是字符串类型)

更新

我喜欢 Jodrell 发表的评论——这将使我的代码看起来像这样:

Dim cacheObject As Object = GlobalCache.Item(key)
If Not IsNothing(cacheObject) Then

    If TypeOf cacheObject Is Int32 Then
        Return Convert.ToInt32(cacheObject)
    End If

End If

'Otherwise get fresh data from DB:
Return GetDataFromDB
4

4 回答 4

3

澄清:这个问题最初被标记为 ;以下仅适用于 C#(尽管可能被翻译成 VB.NET):


如果是盒装的int,那么:

object o = 1, s = "not an int";
int? i = o as int?; // 1, as a Nullable<int>
int? j = s as int?; // null

如此概括:

object o = ...
int? i = o as int?;
if(i == null) {
   // logic for not-an-int
} else {
   // logic for is-an-int, via i.Value
}
于 2013-05-16T08:13:10.907 回答
2

String应避免不必要的转换。

您可以使用Is预先检查类型

Dim value As Integer
If TypeOf obj Is Integer Then
    value = DirectCast(obj, Integer)
Else
    ' You have a problem
End If

或者,

TryCast你可以像这样实现一个变体,

Function BetterTryCast(Of T)(ByVal o As Object, ByRef result As T) As Boolean
    Try
        result = DirectCast(o, T)
        Return True
    Catch
        result = Nothing
        Return False
    End Try
End Function

你可以这样使用

Dim value As Integer
If BetterTryCast(obj, value) Then
    // It worked, the value is in value.
End If
于 2013-05-16T08:22:51.747 回答
1

最简单的是

Int32.TryParse(anObject.ToString, result)

每个 Object 都有一个 ToString 方法,如果您的 Object 不是数字整数,则调用 Int32.TryParse 将避免代价高昂的(就性能而言)异常。如果对象不是字符串,结果的值也将为零。

编辑。Marc Gravell 的回答引起了我的好奇心。对于简单的转换,它的答案似乎很复杂,但它更好吗?所以我试图看看它的答案产生的IL代码

 object o = 1, s = "not an int";
 int? i = o as int?; // 1, as a Nullable<int>
 int? j = s as int?; // null

代码

IL_0000:  ldc.i4.1    
IL_0001:  box         System.Int32
IL_0006:  stloc.0     // o
IL_0007:  ldstr       "not an int"
IL_000C:  stloc.1     // s

而我的回答产生的 IL CODE 如下

IL_0000:  ldc.i4.1    
IL_0001:  box         System.Int32
IL_0006:  stloc.0     // anObject
IL_0007:  ldloc.0     // anObject
IL_0008:  callvirt    System.Object.ToString
IL_000D:  ldloca.s    01 // result
IL_000F:  call        System.Int32.TryParse

毫无疑问,马克的答案是最好的方法。感谢 Marc 让我发现了一些新的东西。

于 2013-05-16T08:13:21.863 回答
0

这有效:

Int32.TryParse(a.ToString(), out b);
于 2013-05-16T08:13:47.570 回答