VB.NET 中Structure和Class的异同点

来源:互联网 发布:微信拍卖商城源码 编辑:程序博客网 时间:2024/05/20 06:51

相同处

  • 都是Contrainer类型,意味着都可以将其它类型作为成员
  • 都可以有成员,所包括构造函数,方法,属性,域,常量,枚举,事件和事件Handler
  • 成员可设成Public或Private
  • 都可以实现接口
  • 都可以有shared constructors, with or without parameters.
  • 都可以有一个默认属性
  • 都可以声明并且发起一个事件,都可以声明委托

不同处

  • Structure是值类型,classe是引用类型
  • Structure用栈来分配; classe用堆来分配
  • structure的成员默认情况下是公共的,而Class的成员变量和常量默认情况下是私有的而其它成员默认情况下是公共的.这与VB6是相兼容的。
  • structure必须至少有一个非共享的成员变量或事件成员,class可以完全是空的.
  • Structure的成员不能声明成Protected; class成员可以.
  • 一个structure过程只能在它是一个Shared Sub时才能handle events而且只能通过AddHandler语句;而任何class过程都可以handle events,既可以用Handles关键字或 AddHandler语句。
  • Structure variable declarations cannot specify initializers, the New keyword, or initial sizes for arrays; class variable declarations can.
  • Structure继承自ValueType类,不能从其它任何类型继承; classes可以从任何不是ValueType的类继承
  • Structure不能继承而Class可以
  • Structure从来不析构terminated因此common language runtime (CLR)从来不调用它的Finalize方法,classe由垃圾回收器进行析构, 当没有任何对该类的引用时调用它的Finalize方法
  • structure 不需要一个构造函数,而Class需要
  • Structure只能有带参数的非共享的构造函数; classes 可以有带或不带参数的构造函数. 每个Structure都有一个默认的不带参数的构造函数以对其成员进行初始化,你可以重新定义该函数

实例与变量
Structure是一个ValueType,也就是值类型,因此每一个Structure变量都绑定到一个Structure的实例。而类是引用类型,可以多个类变量指向同一份类实例

  • Structure的变量声明时相当于调用了Structure的不带参数New,如Dim stru as Structure1相当于Dim stru as Structure1 = New Structure1()
  • 当将一个Structure变量赋值给另一个Structure变量时,将这个变量的所有成员的值复制一份给新的Structure,而将一个类变量赋值给另一个时,只是将一个引用传给它,指向的是同一份类
  • 可以将一个Nothing赋值给一个Structure变量,但这个Structure变量可以继续工作(只是其中的成员变成了初始值,也不能用IsNothing 来判断该Structure是否是Nothing),但一个类变量如果是Nothing的话,将不能对该类的成员进行操作。
  • 不同的类变量可以指向同一个对象,对一个类变量的成员进行改动,另一个类变量的成员也就改变了,但不同的Structure变量的内容
  • 类的相等操作只是比较它们所指的对象是否为同一份,而Structure变量的相等操作是比较两个Structure中的各成员的值是否相等。