首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不使用DirectCast而使用TryCast?

为什么不使用DirectCast而使用TryCast?
EN

Stack Overflow用户
提问于 2008-12-22 07:21:28
回答 4查看 33.1K关注 0票数 26

当我试图将Object obj强制转换为T类型时,如果它不能强制转换,那么一定是出了问题。

在我强制转换对象之后,我将寻找与强制转换对象一起工作。

相反,我希望在我将强制转换它的地方得到一个异常,而不是说我将在哪里使用该对象。

从这个意义上说,使用DirectCast比使用TryCast更好吗?或者我错过了使用TryCast的其他意义?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-22 07:32:53

(对于C#开发人员,TryCast类似于"as“,而DirectCast等同于普通的强制转换。正如迈克在评论中指出的," As“适用于可以为value的值类型,但TryCast不适用。)

如果值真的应该是T,那么DirectCast确实是正确的方法-它失败得很快,并出现了适当的错误。

当目标是“错误的”类型是合法的时,TryCast是合适的。例如,要获取容器中的所有Button控件,您可以遍历控件集合并尝试将每个控件强制转换为Button。如果它起作用了,你就用它做点什么--如果它不起作用,你就继续前进。(对于LINQ,您可以仅使用OfType来实现此目的,但您明白我的意思了……)

在我的经验中,直接转换比TryCast更合适-尽管我发现自己使用泛型转换的频率要比过去少得多。

票数 39
EN

Stack Overflow用户

发布于 2008-12-22 07:33:04

两者之间唯一的区别是,如果失败,TryCast将返回null,而DirectCast将抛出异常。

这些都对你如何处理你的程序有影响。就我个人而言,如果错误类型转换(例如,用户输入的文本输入框被转换为数值类型)的可能性很高,我更喜欢不必抛出异常。

票数 15
EN

Stack Overflow用户

发布于 2009-01-30 21:37:04

我想其他人已经提到了应该和不应该执行“安全强制转换”的时候(即在冒异常风险之前确保强制转换能够成功)。如果您的程序确实需要执行安全类型转换,那么TryCast方法将为您和程序节省一些工作。

直到今天我才意识到TryCast()函数,我觉得自己像个笨蛋,因为我使用了安全强制转换的“坏”方法。

如果您不了解TryCast()函数,那么您可能会得到如下所示的结果:

代码语言:javascript
复制
'' wasteful, the TypeOf and DirectCast calls are redundant
If TypeOf obj Is SomeClass Then
    someObj = DirectCast(obj, SomeClass)
    '' More code
End If

问题是这个方法实际上执行两种类型转换(从技术上讲,我认为它们实际上是类型检查)。使用TryCast并检查结果是否为Nothing可以消除第二次强制转换,并节省不必要的工作。

代码语言:javascript
复制
'' 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

遵循此模式可以避免处理代价高昂的异常,并有效地转换为正确的类型。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/385714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档