当前位置:  开发笔记 > 编程语言 > 正文

为什么使用TryCast而不是DirectCast?

如何解决《为什么使用TryCast而不是DirectCast?》经验,为你挑选了3个好方法。

当我尝试强制转换Object obj为Type时T,如果无法强制转换,则会出现错误.

在我投射对象之后,我将寻找使用投射对象.

相反,我会期望在我将要投射它的地方得到一个例外,而不是说我将使用该对象.

从这个意义上说,使用它DirectCast代替TryCast?或者我错过了使用其他一些意义TryCast



1> Jon Skeet..:

(对于C#开发,TryCast类似"视"和DirectCast正常铸造的等价物.麦克在评论中指出,"作为"空值类型的作品,但TryCast没有.)

如果值确实应该是a T,那么DirectCast确实是正确的方法 - 它会快速失败并出现相应的错误.

TryCast当目标成为"错误"类型是合法的时候是合适的.例如,要获取容器中的所有Button控件,您可以浏览控件集合并尝试将每个控件转换为Button.如果它有效,你会用它做一些事情 - 如果没有,你继续前进.(使用LINQ,你可以只OfType为此目的使用,但你明白我的意思......)

根据我的经验,直接铸造比经常更合适TryCast- 虽然使用仿制药我发现自己的铸造频率比以往任何时候都少.


@Mike:您的评论听起来像"as"处理*所有*值类型.它只处理*nullable*值类型.但是,是的,这是一个区别.会编辑.

2> Jon Limjap..:

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

这些对您如何处理程序有影响.就个人而言,如果不正确演员的可能性(例如,用户输入的文本输入框被转换为数字类型)非常高,我更喜欢不必抛出异常.



3> STW..:

我认为其他人已经提到了你应该而且不应该执行"安全施法"的时间(在你冒着异常的情况下确保施法可以成功的地方).如果您的程序确实需要执行安全转换,那么该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

遵循此模式可以避免必须处理昂贵的异常,并有效地转换为正确的类型.


...我向为我们工作的几个承包商提供了相同的建议,并发现他们滥用TryCast().提醒:如果有VALID原因期望对象不属于目标类型,则仅使用TryCast.如果someObject总是SomeType,那么DirectCast是sucker并让DirectCast抛出异常(如果不是).TryCast()滥用给我们留下了没有证据的错误.该对象不是必需的类型,TryCast没有引发错误,代码没有执行,也没有记录异常.
推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有