编程VB/VB.NET开发人员

如何在Visual Basic中实现用户自定义数据类型(User-Defined Types,UDTs),并在何种情况下应使用它们而不是类?

用 Hintsage AI 助手通过面试

答案

在Visual Basic中,用户自定义数据类型(Type在VB6或Structure在VB.NET中)允许您定义自己的复合类型,包括多个不同类型的变量。这对于打包相关数据非常方便。

UDTs (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Алексей" employee.Age = 32 employee.Height = 1.85

Structures (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Алексей"

何时使用:

  • 用于没有逻辑的轻量级数据容器
  • 当性能重要时(结构体在堆栈中创建)
  • 如果不需要继承功能 — 结构体不支持继承

相对而言: 当需要封装逻辑、继承、多态或实现接口时,使用类。

陷阱问题

为什么在VB.NET中无法将结构赋值为Nothing

答案: 只有类的变量(对象)可以被赋值为Nothing,因为它们存储的是引用。结构体是值类型,它们始终包含值的集合;尝试赋值为Nothing将导致编译错误。

Dim s As Person = Nothing '错误!结构体不能为Nothing(除非是Nullable(Of T))

由于对主题细节不了解而导致的实际错误示例


故事

在一个旧项目中,决定用具有多个字段的结构替换原始的原始数组,但新代码意外变得更慢。结果发现:该结构体的大小非常大,并且在函数中频繁复制。如果使用类,则只会复制引用,而不是整个结构体。


故事

将VB6-UDT迁移到VB.NET时,其中一位开发人员未实现结构的ISerializable接口以进行远程调用。导致被删除的对象无法序列化,这在进程间交互时导致故障。


故事

在一个几何处理模块中,结构体存储了对数组的引用(可变)。多个该结构体的实例导致意外效果,因为结构体内部的引用指向相同的数据数组 — 变更反映在所有副本上!