当我尝试将Object obj
转换为T
类型时,如果无法转换,则表示存在错误。
在我投射对象之后,我将寻找使用投射对象。
相反,我希望在我将要投射它的地方得到一个例外,而不是说我将使用该对象。
从这个意义上说,使用DirectCast
代替TryCast
会更好吗?
或者我错过了使用TryCast
的其他一些意义吗?
答案 0 :(得分:39)
(对于C#开发人员,TryCast
类似于“as”,DirectCast
等同于正常投射。正如Mike在评论中指出的那样,“as”适用于可空值类型,但是TryCast
没有。)
如果值真的应该是T
,那么DirectCast
确实是正确的方法 - 它会快速失败并出现相应的错误。
TryCast
是合适的。例如,要获取容器中的所有Button控件,您可以浏览控件集合并尝试将每个控件转换为Button。如果它有效,你会用它做一些事情 - 如果没有,你继续前进。 (使用LINQ,你可以使用OfType
来达到这个目的,但你明白我的意思......)
根据我的经验,直接投射比TryCast
更合适 - 虽然使用仿制药我发现自己的投射比以往少了很多。
答案 1 :(得分:15)
两者之间的唯一区别是,TryCast
如果失败则会返回null,而DirectCast
会抛出异常。
这些对您如何处理程序有影响。就个人而言,如果不正确演员的可能性(例如,用户输入的文本输入框被转换为数字类型)非常高,我更喜欢不必抛出异常。
答案 2 :(得分:9)
我认为其他人已经提到了你应该而且不应该执行“安全投射”的时间(你确保演员在冒犯异常之前能够成功)。如果您的程序确实需要执行安全转换,那么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
遵循此模式可以避免必须处理昂贵的异常,并有效地转换为正确的类型。
答案 3 :(得分:1)
如果你的设计要求传递给你的对象必须属于T类型,那么断言(如在Debug.Assert中),演员在调试版本中成功并运行详尽的单元测试来证明您的实施遵循您的设计。
通过您的设计经过验证和测试,您可以直接演员表明它永远不会失败。