自从我在2005年从VB6迁移到VB.NET以来,我一直在使用CType从一种数据类型转换到另一种数据类型.我这样做是因为它只是更快地输入,以前存在于VB6中我不知道为什么我必须使用DirectCast,如果它们之间显然没有区别.
我偶尔会使用TryCast,因为我知道有时候施法会失败.但是我无法区分CType和DirectCast.
谁能告诉我简单的简单英语有什么区别两者(CType和DirectCast)有什么区别?添加使用内容的示例也会有所帮助.
我试图将MSDN文章创建动态数据输入用户界面中提供的示例转换为C#,但我坚持使用以下代码:
CType(dq, IUIBuildingBlock).QuestionText = reader("QuestionText")
Run Code Online (Sandbox Code Playgroud)
如何将上述VB.NET语句转换为C#?
假设我在webforms GridViewRow中有一个控件...
<asp:Literal ID="ltl_abc" runat="server" />
Run Code Online (Sandbox Code Playgroud)
在RowDataBound事件中,我可以使用以下任何方法访问控件.我一直以来一直使用DirectCast:
Protected Sub gv_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gv.RowDataBound
Select Case e.Row.RowType
Case DataControlRowType.DataRow
' 1) Dim ltl_abc As Literal = DirectCast(e.Row.FindControl("ltl_abc"), Literal)
' 2) Dim ltl_abc As Literal = CType(e.Row.FindControl("ltl_abc"), Literal)
' 3) Dim ltl_abc As Literal = e.Row.FindControl("ltl_abc")
Run Code Online (Sandbox Code Playgroud)
使用任何特定方法有什么好处吗?我猜DirectCast稍微有点效率,但可能容易出错,但隐式转换是否有任何危险(选项3)?
从历史上看,在我尝试为控件的属性实际赋值之前,我从未见过任何错误,这让我觉得这第一步不是那么重要吗?
请注意,这不是DirectCast与CType的讨论,更多的是关于在这里是否需要施法?
更新清晰
Protected Sub gv_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles gv.RowDataBound
Select Case e.Row.RowType
Case DataControlRowType.DataRow
' This works fine, but no explicit casting is done:
Dim ltl_abc As …Run Code Online (Sandbox Code Playgroud) casting ×2
ctype ×2
vb.net ×2
asp.net ×1
asp.net-4.5 ×1
directcast ×1
equivalent ×1
vb.net-to-c# ×1