当我试图将Object obj强制转换为T类型时,如果它不能强制转换,那么一定是出了问题。
在我强制转换对象之后,我将寻找与强制转换对象一起工作。
相反,我希望在我将强制转换它的地方得到一个异常,而不是说我将在哪里使用该对象。
从这个意义上说,使用DirectCast比使用TryCast更好吗?或者我错过了使用TryCast的其他意义?
发布于 2008-12-22 07:32:53
(对于C#开发人员,TryCast类似于"as“,而DirectCast等同于普通的强制转换。正如迈克在评论中指出的," As“适用于可以为value的值类型,但TryCast不适用。)
如果值真的应该是T,那么DirectCast确实是正确的方法-它失败得很快,并出现了适当的错误。
当目标是“错误的”类型是合法的时,TryCast是合适的。例如,要获取容器中的所有Button控件,您可以遍历控件集合并尝试将每个控件强制转换为Button。如果它起作用了,你就用它做点什么--如果它不起作用,你就继续前进。(对于LINQ,您可以仅使用OfType来实现此目的,但您明白我的意思了……)
在我的经验中,直接转换比TryCast更合适-尽管我发现自己使用泛型转换的频率要比过去少得多。
发布于 2008-12-22 07:33:04
两者之间唯一的区别是,如果失败,TryCast将返回null,而DirectCast将抛出异常。
这些都对你如何处理你的程序有影响。就我个人而言,如果错误类型转换(例如,用户输入的文本输入框被转换为数值类型)的可能性很高,我更喜欢不必抛出异常。
发布于 2009-01-30 21:37:04
我想其他人已经提到了应该和不应该执行“安全强制转换”的时候(即在冒异常风险之前确保强制转换能够成功)。如果您的程序确实需要执行安全类型转换,那么TryCast方法将为您和程序节省一些工作。
直到今天我才意识到TryCast()函数,我觉得自己像个笨蛋,因为我使用了安全强制转换的“坏”方法。
如果您不了解TryCast()函数,那么您可能会得到如下所示的结果:
'' wasteful, the TypeOf and DirectCast calls are redundant
If TypeOf obj Is SomeClass Then
someObj = DirectCast(obj, SomeClass)
'' More code
End If问题是这个方法实际上执行两种类型转换(从技术上讲,我认为它们实际上是类型检查)。使用TryCast并检查结果是否为Nothing可以消除第二次强制转换,并节省不必要的工作。
'' efficient, only one cast is ever performed and there are no InvalidCastExceptions thrown
someObj = TryCast(obj, SomeClass)
If someObj IsNot Nothing Then
'' More code
End If遵循此模式可以避免处理代价高昂的异常,并有效地转换为正确的类型。
https://stackoverflow.com/questions/385714
复制相似问题