vb.net中的强制转换和数据类型转换

转换是将一种数据类型转换为另一种数据类型的过程。例如,将整数类型强制转换为字符串类型。VB.NET中的某些操作需要特定的数据类型才能工作。强制转换将创建所需的类型。本系列由两部分组成的第一篇文章,VB.NET中的强制转换和数据类型转换,介绍了强制转换。本文介绍了可用于在VB.NET中强制转换的三个操作符—DirectCast、CType和TryCast—并比较了它们的性能。...

转换是将一种数据类型转换为另一种数据类型的过程。例如,将整数类型强制转换为字符串类型。VB.NET中的某些操作需要特定的数据类型才能工作。强制转换将创建所需的类型。本系列由两部分组成的第一篇文章,VB.NET中的强制转换和数据类型转换,介绍了强制转换。本文介绍了可用于在VB.NET中强制转换的三个操作符—DirectCast、CType和TryCast—并比较了它们的性能。

Man in profile working on a laptop.

何时使用不同的铸造操作

微软和其他文章称,性能是三家铸造运营商之间最大的差异之一。例如,微软通常谨慎地警告说,“DirectCast。。。在转换数据类型对象和从数据类型对象转换数据时,可以提供比CType更好的性能。”(重点已添加。)

我决定写一些代码来检查。

但首先,我要提醒你一句。丹·阿普尔曼(Dan Appleman)是技术书籍出版商Apress的创始人之一,也是一位可靠的技术大师,他曾告诉我,要正确地进行基准测试,要比大多数人意识到的困难得多。有一些因素,如机器性能、其他可能并行运行的进程、内存缓存或编译器优化等优化,以及您对代码实际执行情况的假设中的错误。在这些基准测试中,我试图消除“苹果和橙子”的比较错误,并且所有测试都是使用发布版本运行的。但这些结果仍可能存在错误。如果您注意到任何问题,请告诉我。

三名铸造操作员是:

  • 直播
  • CType
  • TryCast

直播

实际上,您通常会发现应用程序的要求将决定您使用哪个操作符。DirectCast和TryCast的要求非常狭窄。使用DirectCast时,类型必须已知。虽然代码。。。

字符串=DirectCast(对象,字符串)

... 将成功编译,如果对象不是字符串,则代码将引发运行时异常。

trycast

TryCast的限制性更大,因为它对Integer等“值”类型根本不起作用(字符串是引用类型。有关值类型和引用类型的更多信息,请参阅本系列的第一篇文章)。。。

Integer=TryCast(对象,整数)

... 甚至不会编译。

当您不确定正在使用的对象类型时,TryCast非常有用。TryCast并没有抛出像DirectCast这样的错误,而是什么也不返回。通常的做法是在执行TryCast后不进行任何测试。

ctype

只有CType(以及其他“Convert”操作符,如CInt和CBool)将不具有继承关系的类型(如整数)转换为字符串:

Dim theString As String = "1"Dim theInteger As IntegertheInteger = CType(theString, Integer)

这是因为CType使用不属于.NET CLR(公共语言运行库)的“帮助函数”来执行这些转换。

但是请记住,如果字符串不包含可以转换为整数的内容,那么CType也会抛出异常。如果字符串可能不是这样的整数。。。

Dim theString As String = "George"

... 那么铸造操作员就不能工作了。即使TryCast也不能处理Integer,因为它是一种值类型。在这种情况下,您必须使用有效性检查,如运算符的类型,在尝试强制转换数据之前检查数据。

性能测试

Microsoft的DirectCast文档特别提到使用对象类型进行转换,所以这是我在第一次性能测试中使用的。测试从下一页开始!

DirectCast通常使用对象类型,所以这是我在第一次性能测试中使用的。为了在测试中包括TryCast,我还包括了一个If块,因为几乎所有使用TryCast的程序都有一个If块。然而,在这种情况下,它将永远不会被执行。

下面是将对象强制转换为字符串时比较这三种情况的代码:

Dim theTime As New Stopwatch()Dim theString As StringDim theObject As Object = "An Object"Dim theIterations As Integer =CInt(Iterations.Text) * 1000000'' DirectCast TesttheTime.Start()For i = 0 To theIterationstheString = DirectCast(theObject, String)NexttheTime.Stop()DirectCastTime.Text =theTime.ElapsedMilliseconds.ToString'' CType TesttheTime.Restart()For i As Integer = 0 To theIterationstheString = CType(theObject, String)NexttheTime.Stop()CTypeTime.Text =theTime.ElapsedMilliseconds.ToString'' TryCast TesttheTime.Restart()For i As Integer = 0 To theIterationstheString = TryCast(theObject, String)If theString Is Nothing ThenMsgBox("This should never display")End IfNexttheTime.Stop()TryCastTime.Text =theTime.ElapsedMilliseconds.ToString

这项初步测试似乎表明微软的目标是正确的。这是结果(在不同条件下进行的大量和少量迭代以及重复测试的实验与该结果没有任何显著差异。)

DirectCast和TryCast在323毫秒和356毫秒时相似,但CType在1018毫秒时所用的时间是前者的三倍。当转换这样的引用类型时,您需要为CType在性能上的灵活性付出代价。

但它总是这样工作吗?在他们的DirectCast页面中的Microsoft示例主要用于告诉您使用DirectCast什么不起作用,而不是什么会起作用。以下是Microsoft的示例:

Dim q As Object = 2.37Dim i As Integer = CType(q, Integer)' The following conversion fails at run timeDim j As Integer = DirectCast(q, Integer)Dim f As New System.Windows.Forms.FormDim c As System.Windows.Forms.Control' The following conversion succeeds.c = DirectCast(f, System.Windows.Forms.Control)

换句话说,您不能使用DirectCast(或TryCast,尽管这里没有提及)将对象类型强制转换为整数类型,但可以使用DirectCast将表单类型强制转换为控件类型。

让我们检查一下微软的DirectCast示例的性能。使用上面显示的相同代码模板,替换为。。。

c = DirectCast(f, System.Windows.Forms.Control)

... 与CType和TryCast的类似替换一起输入代码。结果有点令人惊讶。

结果

DirectCast实际上是三个选项中速度最慢的,为145毫秒。CType在127毫秒时稍微快一点,但TryCast(包括If块)在77毫秒时最快。我还试着写我自己的东西:

Class ParentClass...End ClassClass ChildClassInherits ParentClass...End Class

我得到了类似的结果。如果不强制转换对象类型,最好不要使用DirectCast。

  • 发表于 2021-09-07 01:21
  • 阅读 ( 225 )
  • 分类:IT

你可能感兴趣的文章

哦(oop)和流行音乐(pop)的区别

...主要是由于它们在设计解决方案时创建的抽象。编程方法中的抽象将信息的相关性与用户的相关性分离开来透视图POP和OPP的主要区别在于POP创建和使用过程抽象,而OOP则侧重于数据抽象。 什么是哦(oop)? 面向对象编程(OOP)基...

  • 发布于 2020-10-28 20:06
  • 阅读 ( 272 )

功能(function)和vb程序(procedure in vb)的区别

...执行某个任务并向调用代码返回值的过程,而过程是程序中的可执行语句块。 visualbasic(VB.NET)是在微软开发的.NET框架上实现的一种编程语言。它是一种现代的通用编程语言。它有助于开发高效的程序,而且更容易学习语言。...

  • 发布于 2021-07-01 18:59
  • 阅读 ( 279 )

.net(.net)和asp.net(asp.net)的区别

...的.NET源代码都被编译成中间语言(也称为IL),然后IL被转换成机器代码。NET框架提供了如下优点- 1.它提供了一致的面向对象编程基础设施。 2.最小化软件部署和版本控制问题。 3.开发窗口和基于web的应用程序的一致性。 4.促进...

  • 发布于 2021-07-13 08:28
  • 阅读 ( 107 )

vb语言(vb)和运动模拟(vb.net)的区别

...选项。VB是为一个简单而有能力的软件开发而设计的。VB中的程序基本上是一系列创建和操作变量的命令。这种语言的程序也称为宏。 VB.NET代表支持Visual Basic网络的技术。它是Microsoft的.NET framework语言之一。这种语言是专门为VB开...

  • 发布于 2021-07-13 21:15
  • 阅读 ( 253 )

visual basic术语表

...务器和客户端之间传输信息。例如,“购物车”应用程序中的表单可能包含有关购买特定项目的请求的信息。可以使用CGI将信息传递到web服务器。CGI仍然被大量使用,ASP是一个完整的替代方案,可以更好地与Visual Basic配合使用。...

  • 发布于 2021-09-10 22:25
  • 阅读 ( 238 )

有关在visual basic中序列化的所有信息

...要原因是,您可以四处移动对象。考虑可能性。由于.NET中的“一切都是对象”,所以可以序列化任何内容并将其保存到文件中。因此,您可以序列化图片、数据文件、程序模块的当前状态(“状态”类似于程序在某个时间点的...

  • 发布于 2021-09-11 23:49
  • 阅读 ( 193 )

什么是vb.net资源及其使用方法(vb.net resources and how)

...择“资源”选项卡。您可以通过双击解决方案资源管理器中的“我的项目”或“项目”菜单项下的“项目属性”来打开此对话框。 资源文件的类型 串 图像 图标 音频 文件夹 其他 资源文件简化了全球化 使用资源文件增...

  • 发布于 2021-09-11 23:50
  • 阅读 ( 181 )

如何在visual basic 6中创建和使用资源(create and use resources in visual basic 6)

...件 在project Explorer窗口中,您可以在VB 6和VB.NET中看到项目中的资源(VB.NET中的解决方案资源管理器-它们必须使其稍微有所不同)。在VB6中,资源不是默认工具,因此新项目不会有任何资源。因此,让我们为一个项目添加一个简...

  • 发布于 2021-09-11 23:54
  • 阅读 ( 226 )

vb.net解决方案和项目文件“sln”和“vbproj”

...;一整套项目可以是同一解决方案的一部分,该.sln文件中的设置和选项可以应用于其中的所有项目。在VisualStudio中一次只能打开一个解决方案,但该解决方案中可以打开许多项目。这些项目甚至可以使用不同的语言。 通过创...

  • 发布于 2021-09-11 23:55
  • 阅读 ( 221 )

vb.net中的region指令

...,这确实有效: 如果您从internet借用代码,请先查找其中的区域,然后再将其添加到代码中。众所周知,黑客会在一个区域内嵌入不好的东西,以防被发现。

  • 发布于 2021-09-11 23:55
  • 阅读 ( 175 )
qztdt312
qztdt312

0 篇文章

相关推荐