关于vb.net的 CType/DirectCast/TryCast和C#中的as/()
2009年05月03日 星期日 10:06
@H_301_10@vb.net中三种转换[CType/DirectCast/TryCast],到了C#下面TryCast对应as,但是DirectCast +TryCast都变成了(type)var 一种形式,
看来vb.net和C#不完全相等啊,不知道大家怎么理解 @H_301_10@三种转换看这个列表就能知道区别了: CType 函数 任何数据类型 必须在两种数据类型之间定义扩大转换或收缩转换 引发 InvalidCastException DirectCast 任何数据类型 一个类型必须继承自或者实现另一个类型 引发 InvalidCastException TryCast 仅引用类型 一个类型必须继承或者实现另一个类型 返回 Nothing (Visual Basic) @H_301_10@ MSDN中说得更详细: ========================= from MSDN========================================================== -------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------- @H_301_10@DirectCast @H_301_10@在 Object 数据类型之间来回转换时,DirectCast 不使用 Visual Basic 运行时帮助器例程进行转换,因此它可以提供比 CType 更好一些的性能。 @H_301_10@使用 DirectCast 关键字的方法与使用 CType 函数 和 TryCast 关键字相同。提供一个表达式作为第一个参数,提供一个类型以将它转换为第二个参数。DirectCast 需要两个参 @H_301_10@数的数据类型之间的继承或实现关系。这意味着一个类型必须继承或实现另一个类型。 @H_301_10@错误和失败 如果 DirectCast 检测到不存在继承或实现关系,则生成一个编译器错误。但是没有出现编译器错误并不能保证肯定进行了成功的转换。如果需要的转换为收缩转换,则可能在运 @H_301_10@行时失败。如果发生这种状况,运行库会引发一个 InvalidCastException 错误。 @H_301_10@转换关键字 类型转换关键字的对比如下。 @H_301_10@关键字 数据类型 参数关系 运行时失败 CType 函数 任何数据类型 必须在两种数据类型之间定义扩大转换或收缩转换 引发 InvalidCastException DirectCast 任何数据类型 一个类型必须继承自或者实现另一个类型 引发 InvalidCastException TryCast 仅引用类型 一个类型必须继承或者实现另一个类型 返回 Nothing (Visual Basic) @H_301_10@示例 下面的示例演示 DirectCast 的两种用法,一种在运行时发生失败,另一种取得成功。 @H_301_10@Visual Basic 复制代码 Dim q As Object = 2.37 Dim i As Integer = CType(q,Integer) ' The following conversion fails at run time Dim j As Integer = DirectCast(q,Integer) Dim f As New System.Windows.Forms.Form Dim c As System.Windows.Forms.Control ' The following conversion succeeds. c = DirectCast(f,System.Windows.Forms.Control) @H_301_10@以上示例中,q 的运行时类型为 Double。CType 能够成功是因为 Double 可被转换为 Integer。但是,第一个 DirectCast 在运行时失败是因为 Double 的运行时类型与 Integer @H_301_10@没有继承关系,即使是可以进行转换。第二个 DirectCast 成功是因为它从 Form 类型转换为 Control 类型,而 Form 继承自该类型。 -------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------- CType 函数 @H_301_10@更新:2007 年 11 月 @H_301_10@返回表达式显式地转换为指定数据类型、对象、结构、类或接口后的结果。 @H_301_10@ CType(expression,typename) @H_301_10@各部分说明 expression 任何有效的表达式。如果 expression 的值超出 typename 允许的范围,Visual Basic 将引发异常。 @H_301_10@typename 任何在 Dim 语句的 As 子句内合法的表达式,即任何数据类型、对象、结构、类或接口的名称。 @H_301_10@备注 CType 采用内联方式编译,即转换代码是计算表达式的代码的一部分。在某些情况下不需要调用一个过程来完成转换,这会使执行速度更快。 @H_301_10@如果没有定义从 expression 到 typename 的转换,例如从 Integer 转换到 Date,Visual Basic 将显示一条编译时错误信息。 @H_301_10@如果在运行时转换失败,将会引发相应的异常。如果收缩转换失败,最常见的结果是 OverflowException。如果未定义转换,将会发生 InvalidCastException。例如,如果 @H_301_10@expression 的类型为 Object,并且其运行时类型没有转换为 typename,则可能会发生这种情况。 @H_301_10@如果 expression 或 typename 的数据类型为已经定义的类或结构,则可以在该类或结构中将 CType 定义为转换运算符。这将使 CType 用作重载运算符。如果这样做,则可以控 @H_301_10@制转换在类或结构之间进行的转换的行为,包括可能引发的异常。 @H_301_10@重载 CType 运算符也可以在代码之外定义的类或结构中重载。如果您的代码需要在这样的类或结构之间进行转换,请确定您了解其 CType 运算符的行为。有关更多信息,请参见运算符 @H_301_10@过程。 @H_301_10@示例 下面的示例使用 CType 函数将表达式转换为指定的数据类型。 @H_301_10@Visual Basic 复制代码 Dim testNumber As Long = 1000 ' The following line of code sets testNewType to 1000.0. Dim testNewType As Single = CType(testNumber,Single) @H_301_10@ -------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------- TryCast @H_301_10@引入不引发异常的类型转换操作。 @H_301_10@备注 如果尝试转换失败,则 CType 和 DirectCast 都会引发 InvalidCastException 错误。这将给应用程序的性能造成负面影响。TryCast 返回 Nothing (Visual Basic),因此只需 @H_301_10@测试返回的结果是否为 Nothing,而无需处理可能产生的异常。 @H_301_10@使用 TryCast 关键字的方法与使用 CType 函数和 DirectCast 关键字的方法相同。提供一个表达式作为第一个参数,并提供要将其转换成的类型作为第二个参数。TryCast 仅适 @H_301_10@用于引用类型,如类和接口。它要求这两种类型之间的关系为继承或实现。这意味着一个类型必须继承自或实现另一个类型。 @H_301_10@错误和失败 如果 TryCast 检测到不存在任何继承或实现关系,它将生成一个编译器错误。但是不出现编译器错误并不能保证转换成功。如果需要的转换为收缩转换,它可能在运行时失败。如 @H_301_10@果发生这种情况,TryCast 返回 Nothing (Visual Basic)。 @H_301_10@转换关键字 以下是类型转换关键字的对比。 @H_301_10@关键字 数据类型 参数关系 运行时失败 CType 函数 任何数据类型 必须在两种数据类型之间定义扩大转换或收缩转换 引发 InvalidCastException DirectCast 任何数据类型 一个类型必须继承自或者实现另一个类型 引发 InvalidCastException TryCast 仅引用类型 一个类型必须继承自或者实现另一个类型 返回 Nothing (Visual Basic)。 @H_301_10@示例 下面的示例显示如何使用 TryCast。 @H_301_10@Visual Basic 复制代码 Function PrintTypeCode(ByVal obj As Object) As String Dim objAsConvertible As IConvertible = TryCast(obj,IConvertible) If objAsConvertible Is Nothing Then Return obj.ToString() & " does not implement IConvertible" Else Return "Type code is " & objAsConvertible.GetTypeCode() End If End Function |