VB CStr、CDate、CBool 等与 DirectCast 的比较,无需转换即可进行投射
Posted
技术标签:
【中文标题】VB CStr、CDate、CBool 等与 DirectCast 的比较,无需转换即可进行投射【英文标题】:VB CStr, CDate, CBool, etc. vs. DirectCast for casting without conversion 【发布时间】:2010-11-25 15:47:27 【问题描述】:除非我需要进行实际的转换,否则我通常会避免使用 VB 的内置转换函数(CStr、CDate、CBool、CInt 等)。如果我只是强制转换,比如说从一个对象到一个字符串,我通常使用 DirectCast 或 TryCast,假设 CStr 等正在做一些我不需要的额外东西。但有时 DirectCast 语法有点麻烦,如下例所示。
Dim value1 As String
Dim value2 As String
Using cn As New SqlConnection(cnStr)
Using cmd as New SqlCommmand(sqlStr, cn)
Using reader = cmd.ExecuteReader()
While reader.Read()
value1 = DirectCast(reader("COLUMN1"), String)
value2 = CStr(reader("COLUMN1"))
End While
End Using
End Using
End Using
SqlDataReader.Item 返回一个 Object,需要将其转换为 String。 CStr 更易于阅读、键入和解释 (IMO)。
我的问题是,我使用哪一个重要吗?我是否应该只使用 CStr(以及 CDate 和 CBool 等)而不用担心我假设这些函数正在做的额外工作?
使用这些功能还有其他缺点吗?
【问题讨论】:
【参考方案1】:在您的示例中,您可以使用:
value1 = reader("COLUMN1").ToString()
它将列的内容作为字符串返回。
如果可以的话,我总是倾向于在对象上使用 ToString()。有时对象的 ToString() 方法会返回对象的类名之类的东西,而不是内容,因此 .ToString() 并不总是一个选项。
我认为不需要任何 VB 函数 CStr、CInt 等,因为 .NET 框架提供了很多不错的替代方案。例如。
Dim value As Integer = Convert.ToInt32(reader("Number").ToString())
是将字符串转换为 int 的好方法。这些转换方法值得一读,因为旧的 VB 风格函数只是为了向后兼容。
【讨论】:
感谢您的评论。我以字符串为例,但这个问题也适用于日期、布尔值、整数等。ToString 是一个很好的字符串建议。【参考方案2】:大多数时候,我使用 CStr、CInt、CBool 和 CType,因为它们更短且更易于阅读。可能会有轻微的性能成本,但大多数时候这并不重要。不过,很高兴了解 CType、TryCast、DirectCast 等之间的区别。
【讨论】:
【参考方案3】:This is a good post 在 cmets 中讨论 DirectCast 与 CType 转换和变体。
简而言之,如果您想明确说明并知道会发生什么,建议使用 DirectCast。另一方面,Paul Vick(VB 技术主管)的评论说这并不重要,只需使用 CType 变体即可。
从该帖子中收集到一些有用的链接:
How should I cast in VB.NET? DirectCast Revealed(在 Paul Vick 的博客上发帖)【讨论】:
Paul Vick 只说 DirectCast 的速度优势并不重要。但 DirectCast 的另一个优点是安全性(及早发现编程错误)。不加选择地使用 CStr 等是向Option Strict Off
倒退的一步。而你不希望那样。以上是关于VB CStr、CDate、CBool 等与 DirectCast 的比较,无需转换即可进行投射的主要内容,如果未能解决你的问题,请参考以下文章