结构 Structure

如果对类比较熟悉,先看看结构和类的异同点:

结构和类

Visual Basic .NET 统一了结构和类的语法,结果就是两个实体都支持大多数的相同功能。但是,在结构和类之间还有着重要的区别。

相同点

结构和类在以下方面相同:

  • 两者都属于“容器”类型,表示它们可以包含其他类型作为成员。
  • 两者都具有成员,成员可以包括构造函数、方法、属性、字段、常数、枚举、事件和事件处理程序。
  • 两者的成员都具有单独的可访问性。例如,一个成员可以声明为 Public ,而另一个可以声明为 Private
  • 都可实现接口。
  • 都有共享的构造函数,有或没有参数。
  • 两者都可以公开默认属性,只要该属性至少带有一个参数。
  • 两者都可以声明和引发事件,而且两者都可以声明委托。

不同点

结构和类在以下方面有所不同:

  • 结构是值类型,而类是引用类型。
  • 结构使用堆栈分配,类使用堆分配。
  • 所有的结构成员都默认为 Public ;类变量和常量默认为 Private ,而其他的类成员默认为 Public 。类成员的这一行为提供与 Visual Basic 6.0 默认值系统的兼容。
  • 结构必须至少具有一个非共享变量或事件成员;而类可以完全是空的。
  • 结构成员不能声明为 Protected ,类成员可以。
  • 只有 Shared Sub 结构过程才能处理事件,并且只能使用 AddHandler 语句;而任何类过程都可以处理事件,并且可以使用 Handles 关键字或 AddHandler 语句。
  • 结构变量声明不能指定初始值、 New 关键字或数组初始大小,类变量声明可以。
  • 结构从 ValueType 类隐式继承,不能从其他类型继承,类可以从除 ValueType 之外的其他任何类继承。
  • 结构是不可继承的;而类可以继承。
  • 结构从不终止,所以公共语言运行库 (CLR) 从不在任何结构上调用 Finalize 方法,类可由垃圾回收器终止,当检测到没有剩下的活动引用时,垃圾回收器将在类上调用 Finalize
  • 结构不需要构造函数;而类需要。
  • 结构仅当没有参数时可以有非共享的构造函数;类无论有没有参数都可以。

每一个结构都有不带参数的隐式公共构造函数。此构造函数将结构的所有数据成员初始化为默认值。不能重定义此行为。

实例和变量

由于结构是值类型,每个结构变量都永久地绑定到一个单独的结构实例。但类是引用类型,对象变量可引用各种类实例。此区别在下列方面影响结构和类的使用:

  • 结构变量使用结构的无参数构造函数隐式包含成员初始化。因此, Dim S As Struct1 等效于 Dim S As Struct1 = New Struct1()
  • 当将一个结构变量赋给另一个,或传递一个结构实例到过程参数,所有变量成员的当前值都被复制到新结构中。当将一个对象变量赋给另一个,或传递一个对象变量到过程,仅有引用指针被复制。
  • 可以将值 Nothing 赋给结构变量,但实例继续保持与变量的关联。尽管赋值重新初始化了变量成员,仍可以调用其方法并访问其数据成员。相比之下,如果将对象变量设为 Nothing ,将其与任何类实例断开关联,在给它赋予另一个实例前,不能通过变量访问其他成员。
  • 对象变量可以有在不同时间赋给它的不同的类实例,几个对象变量可以同时引用同一个类实例。当通过指向同一实例的另一个变量访问时,更改的类成员的值会影响这些成员。但是,结构成员独立存在于其自身实例中。更改其值不会在其他任何结构变量中反映出来,即使是在同一 Structure 声明的其他实例中。
  • 两个结构的等效性测试必须在成员对成员的测试中进行。两个对象变量可使用 Equals 方法进行比较。 Equals 指示两个变量是否指向同一实例。

Structure 语句

Structure 语句只能在模块、命名空间或文件级出现。这就是说可以在源文件或模块、接口或类内部声明结构,但不能在过程内部进行声明。也可以在一个结构中定义另一个结构,但不能通过外部结构访问内部结构的成员。而是必须声明一个内部结构的数据类型变量。

可以从声明结构的模块或类内的任何位置访问它们。默认情况下,结构为 Friend 。若要更详细地指定可访问性,请在 Structure 语句中包括 PublicFriendProtected FriendPrivate

必须声明结构的每一数据成员。这意味着 variabledeclarations 部分中的每一语句必须使用 DimFriendPrivatePublic 。由于无法从结构中继承,因此结构成员不能是 ProtectedProtected Friend 。但结构本身可以是 ProtectedProtected Friend

如果 Option StrictOn ,则在每一个成员声明中还必须包含 As 子句。用 Dim 声明的成员默认为 Public 访问,未用 As 子句声明的成员默认为 Object 数据类型。

在结构中必须至少定义一个非共享变量或事件。在结构中不能只包含常数、属性和过程,即使某些成员是非共享的。

结构成员的范围是整个结构。

不能将结构的任何数据成员的值初始化成其声明的一部分。必须通过结构上参数化的构造函数初始化数据成员,或者在创建了该结构的实例后将值赋给该成员。

结构支持的许多功能与类支持的一样。例如,结构可以拥有属性和方法,可以实现接口,也可以拥有参数化的构造函数。但是,在某些地方(例如继承、声明和用法)结构和类之间存在着重大的差异。

(以上资料来自MSDN)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus