当我尝试强制转换Object obj
为Type时T
,如果无法强制转换,则会出现错误.
在我投射对象之后,我将寻找使用投射对象.
相反,我会期望在我将要投射它的地方得到一个例外,而不是说我将使用该对象.
从这个意义上说,使用它DirectCast
代替TryCast
?或者我错过了使用其他一些意义TryCast
?
(对于C#开发,TryCast
类似"视"和DirectCast
正常铸造的等价物.麦克在评论中指出,"作为"空值类型的作品,但TryCast
没有.)
如果值确实应该是a T
,那么DirectCast
确实是正确的方法 - 它会快速失败并出现相应的错误.
TryCast
当目标成为"错误"类型是合法的时候是合适的.例如,要获取容器中的所有Button控件,您可以浏览控件集合并尝试将每个控件转换为Button.如果它有效,你会用它做一些事情 - 如果没有,你继续前进.(使用LINQ,你可以只OfType
为此目的使用,但你明白我的意思......)
根据我的经验,直接铸造比经常更合适TryCast
- 虽然使用仿制药我发现自己的铸造频率比以往任何时候都少.
两者之间的唯一区别是,a TryCast
如果失败则返回null,而a DirectCast
将抛出异常.
这些对您如何处理程序有影响.就个人而言,如果不正确演员的可能性(例如,用户输入的文本输入框被转换为数字类型)非常高,我更喜欢不必抛出异常.
我认为其他人已经提到了你应该而且不应该执行"安全施法"的时间(在你冒着异常的情况下确保施法可以成功的地方).如果您的程序确实需要执行安全转换,那么该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
遵循此模式可以避免必须处理昂贵的异常,并有效地转换为正确的类型.