vb.net源码:VB.NET的旅( 4)—类和结构

  刚上班就被大李找去了“Henry昨天对窗体操作给你最大体会是什么?”

  “当然有体会最深印象就是VB.NET中类是无所不在了连窗体都成为了个类”我深有感触地说

  “没错类是我们用来构造VB.NET应用最基本编程结构了你也学习过最基本面向对象编程了那么你能告诉我结构和类有什么相似的处和区别的处吗?”

  “好”我口中回答着心里还是有点不以为然“结构和类都是对成员封装方式但是类可以支持继承……”

  大李边点着头边听我说听到我最后支吾着没了声音才抬起头“还有呢?”

  “没了”我这时才开始心中发慌

  “呵呵相同的处我想你心中还是明白它们都含有成员包括构造、思路方法、属性、字段、常量、枚举和事件都可以实现接口都有共享构造

  “对不起最后那都有构造是什么意思?结构构造我从来没有自己定义过

  大李立刻写下了这段代码:

Structure SHenry 
 
  Public x, y As Integer 
 
  Public Sub New(ByVal x As Integer, ByVal y As Integer) 
 
    Me.x = x 
 
    Me.y = y 
 
  End Sub 
 
End Structure 
 
Sub  
 
  Dim H1 As SHenry = New SHenry 
 
  Dim H2 As SHenry = New SHenry(2, 1) 
 
End Sub 


  “真可以实现结构构造!”我还直没有注意过这个问题“可是你只定义过个带参数构造H2例子化我是明白可是H1如何也能通过编译器检测呢?”其实我心中更想问是结构如何也能例子化成对象那和类真很象呀

  “原因么”大李推了推眼镜“每个结构都隐式地具有 Public 无参数例子构造该构造产生结构默认值所以你平时不写构造样可以New出个结构来对吧?事实上我们反而在结构类型声明中不可能声明无参数例子构造只能声明‘参数化’例子构造

  “都可以用来例子化结构和类在内存分配上难道也是吗?”这个问题我直挺不明白正好借这个话题问

  “在这上面差别可就大了”看到大李喜笑颜开样子我就知道问到点子上了立刻摆开架势作认真倾听状

  “简单来说结构是值类型而类是引用类型因此结构使用堆栈分配类使用堆分配

  看到我迷茫双眼大李笑了笑在电脑上飞快地写了个举例:

Class CHenry 
 
    Public z As Integer = 0 
 
    ‘能对非静态成员化也是个区别 
 
End Class 
 
Sub  
 
  Dim H1 As SHenry = New SHenry(0, 2) '赋给H1.x=0 
 
  Dim H2 As SHenry = H1 
 
  H2.x = 26 
 
  Dim R1 As New CHenry 'R1.z也是等于0 
 
  Dim R2 As CHenry = R1 
 
  R2.z = 26 
 
  Console.WriteLine("H1.x=" &H1.x&",H2.x="& H2.x) 
 
  Console.WriteLine("R1.z= "&R1.z&",R2.value= "& R2.z) 
 
End Sub 


  “你看下结果应该是什么?”大李边说边运行了:

H1.x= 0,  H2.x= 26 
 
R1.z= 26,  R2.value= 26


  大李看着我瞪圆双眼慢慢地说:“这就是值类型和引用类型差别结构例子 H2.x 赋值并不影响H1.x这是虽然它们同属于种SHenry结构但它们都有各自存储空间相反给 R2.z赋值26后; 则会影响R1 和 R2 都引用对象”

  “说得更清楚类作为引用类型是存储在运行时堆上只能通过引用该存储来访问它们不能直接访问引用类型变量总是包含该类型值引用或包含空引用空引用不引用任何内容;除分配空引用外对空引用进行任何操作都是无效引用类型变量赋值只会创建引用个副本而不是所引用副本它们实际上都是会指向同块存储区”大李手指了指运行结果

  “结构是直接存储在堆栈上要么在要么在另个类型中当包含结构例子位置被销毁时结构例子也会被销毁值类型总是可以直接访问我们不能创建对值类型引用也不能引用已销毁值类型例子值类型变量总是包含此类型和引用类型区别值类型值不能为空引用也不能引用派生相近程度较大类型对象值类型变量赋值会创建所赋副本当然会新开辟块内存区来保存值

  “哦我明白了它们还有什么区别没有?”我对结构和类区别第次有了深刻感觉

  “当然有很多比如所有结构成员都默认为 Public类变量和常量默认为 Private其他类成员默认为 Public;结构成员不能声明为 Protected类成员可以;结构过程不能处理事件类过程可以;结构变量声明不能指定值、New 关键字或大小类变量声明可以”大李喝了口水停了然后继续说



  “结构从不终止所以公共语言运行库从不在任何结构上 Finalize 思路方法;类可由垃圾回收器终止垃圾回收器会跟踪未完成引用直到某个特定例子当检测到没有剩下活动引用时垃圾回收器将在类上 Finalize

  “这个我可以理解结构是值类型是由系统统管理内存不是引用所以不会对内存造成危害”我接着说了两句

  “还有你刚才也提到了它们的间个很重要区别:结构是不可继承而类可以继承其实结构自身是从 ValueType 类隐式继承下来数据类型可分为值类型和引用类型值类型要么是堆栈分配要么是在结构中以内联方式分配引用类型是堆分配引用类型和值类型都是从最终基类 Object 派生出来当值类型需要充当对象时就在堆上分配个包装该包装能使值类型看上去像引用对象并且将该值类型值复制给它该包装被加上标记以便系统知道它包含个值类型这个进程称为装箱其反向进程称为取消装箱装箱和取消装箱能够使任何类型像对象样进行处理

  “哦我明白为什么结构也能被例子化成对象了!”我心中喜不自禁“类继承我在用C和Java时也经常使用但是VB6是不支持继承上次您提到VB.NET可以支持继承了它是如何做到呀!”



Tags:  vb.net源码

延伸阅读

最新评论

发表评论