多语言展示
当前在线:546今日阅读:103今日分享:49

VB.NET编程语言 经验分享

VB.NET之旅(一)—失踪的窗体良久没有新作,架不住兄弟们的问询与追问,只得拿些旧作来补上迩来没空写作的缺少。惭愧ing!这一系列与Henry手记系列不相同,是一个人物方法的景象故事,初步发表于《计算机世界》,适用于VB.net初教授,老鸟们就不用在我这一系列的文章上浪费时间了。我希望自个有时间往后,能不断继续这一系列的文章,参与许多的工程处置计划。一同,我的Henry手记也会继续写下去,以酬谢长时间以来支撑我的全部兄弟。布景:我叫Henry,刚从大学计算机专业毕业,的.NET开发小组;担任带我的头目是大李,.NET高手,是个诙谐又有耐性的家伙;老白是我们有些的头头,常常带给我们古怪又难缠的需要。第一天上班,白司理就带着我去.NET技术小组报到。“大李,这是新来的同事,你要多帮帮他。”老白指着我对一个眼镜后边透着闪闪目光的年轻人说。“没疑问,他会做得极好的。”大李难道会看相不成?仍是人家推让呀?不管了,我只需自个极力就对了。20分钟后,我现已在分配给我的一台P4电脑,WindowsXP平台下翻开了Visual Studio.NET的集成编译环境(IDE)初步欣赏了。一个多秀丽的编译环境呀,可以自选运用时的特性是VB6的还是VC6的。我选择的是RAD功用好的VB6特性。“你刚初步接触.NET,在体系练习之前先加深点形象,看看VB.NET与VB6有啥不相同吧。你创建两个窗体,每个窗体上各有一个按钮,点击时躲藏其地址的那个窗体,切换出另一个窗体来。”大李的动静在耳边响起,打断了我对IDE的欣赏。但他提的需要也太简略了吧,在VB6中只需要两句写在按钮的单击照应中的语句就行了:两个窗体:Form1与Form2。Form1上的按钮为: Command1,Form2上的按钮为: Command2Private Sub Command1_Click()  Me.Hide  Form2.ShowEnd Sub Private Sub Command2_Click()  Me.Hide  Form1.ShowEnd Sub所以,我毫不犹豫地在VS.NET中内初步我的第一个VB.NET的项目了。首要,新建了一个VB.NET的Windows应用程序项目,自动生成了一个Windows Form:Form1,在其上参与一个按钮控件:Button1;然后,添加了一个Windows Form:Form2,在其上参与了一个按钮控件:Button2。在描写窗口双击Button1后,编译器会切换到代码窗口的Button1的单击照应代码中。在代码段中故计重施,当我想写Form2.Show时,在Form2之后打个点,出现的智能感知菜单中,却没有Show这一方法。真新鲜,这如何可以?难道VB.NET改动有这么大。我俯首看了看站在我身旁的大李。大李立刻面露浅笑,看来是正中他的圈套。他手指向屏幕,点了点Form1中的代码的开始处:Public Class Form1    Inherits System.Windows.Forms.Form不笨的我立刻就知道了,如今的Form1是一个从System.Windows.Forms.Form继承下来的类了,调用的时分当然需要先实例化了,哈,也不难嘛。立刻动手:Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.ClickMe.Hide()        Dim frm2 As New Form2() ‘实例化Form2类,得到一个方针frm2.Show()End Sub在Form2的Button2的单击作业中也类似地写了一段代码,作业一下,和VB6的作用差不多了。正在得意中,大李走过来,在我的Form1中添加了一个文本框textbox1,清空其间的文字。然后作业了一下程序。在作业中,他在文本框里写了几个字:“Henry的作品”,然后点击Button1切换到Form2,接着点击Button2,从头出现的Form1的文本框中却成为了空白。“这……”我一时语塞,慢慢地想起点啥,“大约是程序通过New计划方法,每次点击按钮都会从头实例化一次Form类吧?所以每次从头出现的窗体都不是早年早年出现过的那个。那早年的窗体也就失踪了,调不出来了。”“失踪?”大李不由笑了起来,“对呀,失踪在内存中。你每实例化一次,体系就会开荒一块内存给一个方针,并会有相应的线程对其进行控制与处置。如果作为进程中主线程的第一个Form1被Hide起来,没有关闭它,那么即使你关闭后来新创建的全部窗体,进程也不会被连续。那么,用啥方法去找回你失踪的窗体,或许说如何就只运用一个方针,不再每次实例化呢?”“全局方针!”我脱口而出,感触到大李不置可否,只好硬着头皮继续说:“运用全局变量,使Form1与Form2只实例化一次,这样就可以了。”然后,在大李的注视下,我初步实施我的计划:再创建一个模块文件:module1.vb,而且同时在:处置计划处置器-〉项目名.sln -〉右点鼠标-〉特色-〉通用属性->常规->发起方针-〉改为Module1。让程序发起后先作业Module1中的代码指令,然后编写代码如下:'Module1.vbModule Module1    Public frm1 As New Form1()  ‘定义Form1的共用变量实例    Public frm2 As New Form2() ‘定义Form1的共用变量实例    Sub Main()        Application.Run(frm1) ‘这句话标明程序发起了modele后,会接下来作业frm1,即form1的一个实例。      主线程就成为作业期的frm1了。    End SubEnd Module这样一来,frm1、frm2就成为全局变量了,在Button1与Button2的单击照应代码中只需写:frm1.show就可以了。再作业程序,可以了,“Henry的作品”一贯都会保持在Form1中的文本框里。大李老哥没等我欢笑起来就再次出手,在frm1躲藏起来的时分,关闭了Form2窗口(frm2实例),桌面上啥窗体都没有了,进程又一次被堕入在无法连续的情况下。My God,面向方针的VB.NET,爱你难道真的这么难……VB.NET之旅(二)—计划与析构在Form1窗体的实例被躲藏的时分,关闭了Form2窗体的实例,使我失去了对主线程的人工控制,进程无法正常关闭了。只好运用Ctrl+Alt+Del调出体系进程处置器,强行连续了该进程。为了避免俯首看见大李的笑脸,我只好垂头想办法。有了,我只需能截获Form2实例关闭的消息,不就可以再调出躲藏的主线程窗体了吗?在Form2的基类事件(Base Class Event)中重载Closing方法进行处置:Private Sub Form2_Closing(ByVal sender As Object, ByVal e As _System.ComponentModel.CancelEventArgs) Handles MyBase.Closing        frm1.Show()    End Sub哈,很便当,我关闭了Form2窗体的实例后,被躲藏的那个frm1又出现了。“嗯,”大李总算发话了,“你再点击一下Form1窗体上的Button1试试。”我背心一凉,模糊感触大李等待着的便是这个时分。无法的我还只能照他说的去做。公开,弹出一个出错窗口.“你关闭了frm2这个Form2的实例,也就结束了这个方针的生存期,”大李看来是蓄势已久了,“这便是犯错提示中所说的‘无法访问名为Form2的已处置方针’。当我们关闭一个窗口的时分,会宣告一个终止照应,并将该窗口方针,就象上面定义的frm2,送入中止队伍,公共言语运行库的废物回收器跟踪着这个方针的生存期,此时就会调用此方针基类,比如Form2的Dispose方法,用于销毁方针并回收资源。所以……”“所以我只需区分一下frm2是不是被销毁就行了,如果销毁了,我就再计划一个实例不就行了?”我恍然大悟道。大李初次浅笑地址了容许说:“用frm2.IsDisposed就可以来区分了。”我心照不宣地写道:Private Sub Button1_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles Button1.Click        If frm2 Is Nothing Or frm2.IsDisposed Then  ‘区分方针是不是被销毁            frm2 = New Form2()        End If        Me.Hide()        frm2.Show()    End Sub这下完善多了,两个窗体之间的切换也不会有这么多别扭的疑问了。我转过身,看到大李现已找了把椅子坐在我的身边。“你来说说,对VB.NET的窗体实例的创建与销毁的进程吧。”我收拾了一下凌乱的思路,长吁了一口气,初步说:“一个窗体类,比如Form1类是通过调用其基类,就是Form类的New方法来创建实例、Dispose方法来销毁实例。”“没错。”大李边说话,一边在我的程序中点击开来被代码窗口自动折叠起来的' Windows窗体描写器生成的代码':Public Sub New()        MyBase.New()        '该调用是 Windows 窗体描写器所必需的。        InitializeComponent()        '在 InitializeComponent() 调用之后添加任何初始化    End Sub    '窗体重写处置以收拾组件列表。    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)        If disposing Then            If Not (components Is Nothing) Then                components.Dispose()            End If        End If        MyBase.Dispose(disposing)    End Sub大李初步阐明道:“MyBase要害字的举动类似于引用类的其时实例的基类的方针变量。MyBase常用于访问在派生类中被重写或躲藏的基类成员。在这段代码中,MyBase指的当然便是System.Windows.Forms.Form类了。计划方针时用的New方法是显式调用的,没什么好阐明的。但析构的方法值得一说。”他看了我一想,继续说:“Form.Dispose方法是重写自Control.Dispose方法的,那么Control.Dispose方法的意义又是如何的?它的作用便是:开释由Control占用的非保管资源,还可以别的再开释保管资源。当它参数中的disposing为true则开释保管资源和非保管资源;为false则仅开释非保管资源。Form类的disposing为true。在关闭窗体时自动调用dispose的功用是得益于.net的公共语言作业库,运行库自动处置方针计划和处置对方针的引用,当不再运用方针时释放它们。其生存期以这种方法来处置的方针称为保管数据。自动内存处置消除了内存泄露以及其他一些常见的编程差错。任何类型的Dispose方法都大约开释它具有的全部资源。它还大约通过调用其父类型的Dispose方法开释其基类型具有的全部资源。该父类型的Dispose方法大约开释它具有的全部资源并相同也调用其父类型的Dispose方法,从而在整个基类型层次计划中传达该方法。要确保始终正确地收拾资源,Dispose方法大约可以被多次安全调用而不引发任何失常。”“可是,如果体系疑问或应用程序调用上出了疑问,不能正常调用Dispose如何办?”我想起了啥,问道。“如果通过Dispose还开释不洁净或没有调用Dispose,体系的废物回收器会调用方针的Finalize方法进行根除。因为实行Finalize方法会大大减损功用,所以我们不会一初步就用它去进行根除作业。”大李稍微阐明晰一下。我总算想起了一个重要的疑问:“如果总是在模块中定义的全局变量来处置,因为访问规划太大,会不会有安全性的疑问?”“当然,我们可以试试其他的处置计划。”总是有备而言。VB.NET之旅(三)—同享成员一同对VB.NET充满了猎奇与知道的盼望。“除了全局变量外,还有啥好方法吗?”我迫不急待地想知道作用。“可以运用同享成员。”大李依然是那么淡漠视,“VB.NET如今是支撑实在的面向方针编程,可以继承、运用多态、同享成员和静态成员。同享成员便是在全部类和所定义派生类的实例之间同享的方法、属性、字段和作业。全部运用类创建的方针都可以访问相同的数据、同享结束进程,而且收到相同的激起作业。”“这么好呀,那如何结束呢?”我好象又回到了课堂上,满脑都是无知的符号。“很简略,在Public或Private成员修饰符后加上Shared要害字即可了。Shared要害字指示一个或多个被声明的编程元素将被同享。同享元素不关联于某类或计划的特定实例。可以通过运用类名或计划称谓或许类或计划的特定实例的变量称谓约束同享元历来访问它们。你来看这段代码Public Class ShareClass     Public Shared SharedValue As String     Public Shared Sub ShareMethod()        MsgBox('This is a shared method.')      End Sub  End ClassSub  TestShared()     Dim Shared1 As New ShareClass()  ' 创建了类的一个实例.     Dim Shared2 As New ShareClass()  '创建了类的第二个实例.     Shared1.SharedValue = 'Share Value 1'  '给同享字段赋值.     Shared2.SharedValue = 'Share Value 2'  ' 重写同享字段的值     ShareClass.ShareMethod()    '不用创建实例就可以调用类的方法.  End Sub“有两个要害,一个是同享成员如果是方法或特色,我们不用创建实例就可以直接用‘类名.共享成员’的方法进行调用;第二个要害,同享字段是仅有的,你来说说作业后Shared1.SharesValue的值是多少?”我脑筋里转了两圈,已然说同享字段是仅有的,那么Shared1.SharedValue和Shared2.SharedValue其实对应的是同一个同享字段,所以么,我立刻大声说:“是Share Value 2。因为被Shared2.SharedValue修改了。”“没错!”大李又一次绽放了体会的浅笑,真是对我的最高奖赏。“那你还不着手批改一下你的程序?”好!说做就做。已然同享特色在其调用的时分是不用实例化的,那么我最佳能凭仗计划一个同享特色来结束。而且要可以区分其实例是不是存在或是不是被销毁,如果不存在就计划一个新的窗体实例,如果存在就对其进行调用:Private Shared m_vb6FormDefInstance As Form1  Public Shared Property DefInstance() As Form1    Get  If m_vb6FormDefInstance Is Nothing OrElse _        m_vb6FormDefInstance.IsDisposed Then   ‘区分窗体实例是不是存在          m_vb6FormDefInstance = New Form1()        End If      DefInstance = m_vb6FormDefInstance     End Get     Set(ByVal Value As Form1)       m_vb6FormDefInstance = Value     End Set  End Property在Form2中也参与类似的代码,只不过把Form1改为Form2。调用它是如此的便当://Form1中的代码  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click      Me.Hide()      Form2.DefInstance.Show()  End Sub  //Form2中的代码   Private Sub Button1_Click(ByVal sender As _  System.Object, ByVal e As System.EventArgs) _  Handles Button1.Click      Me.Hide()      Form1.DefInstance.Show()   End Sub  Private Sub Form2_Closing(ByVal sender As Object,_  ByVal e As System.ComponentModel.CancelEventArgs) _   Handles MyBase.Closing      Form1.DefInstance.Show()   End Sub急忙作业一下,不对呀,第一个窗体里文本框改为“Henry的作品”后,再切换仍是不见了?我疑问地俯首看了看大李。“你再好好想想,初次发起的是啥?”大李模糊地说了一句。“初次发起的是作为主线程的Form1窗体呀!”我嘟啷着说。“那么Form1.DefInstance在哪呢?”大李这句话真是惊醒梦中人呀!我立刻着手:Module Module1    Sub Main()      Application.Run(Form1.DefInstance)     End Sub  End Module并把Module1设为发起项目。作业作业……哈哈,全部都满足!我初步喜爱上VB.NET了。VB.NET之旅(四)—类和计划刚上班,就被大李找去了。“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 main()    Dim H1 As SHenry = New SHenry()    Dim H2 As SHenry = New SHenry(2, 1)  End Sub“真的呢,可以结束计划的计划函数!”我还一贯没有注意过这个疑问。“可是,你只定义过一个带参数的计划函数,H2的实例化我是知道的,可是H1如何也能通过编译器检测呢?”其实我心中更想问的是计划如何也能实例化成方针,那和类真的很象呀。“缘由么,”大李推了推眼镜,“每个计划都隐式地具有Public无参数实例构造函数,该计划函数产生计划的默许值。所以你往常不写计划函数,也相同可以New出一个计划来,对吧?事实上,我们反而在计划类型声明中不可能声明无参数实例计划函数。只能声明‘参数化’实例计划函数。”“都可以用new来实例化,计划和类在内存分配上难道也是相同的吗?”这个疑问我一贯挺不知道,正好借这个论题问一下。“在这上面,不相同可就大了。”看到大李满面笑容的姿态,我就知道问到点子上了,立刻摆开姿态,作细心倾听状。“简略来说,计划是值类型,而类是引用类型。因此,计划运用库房分配,类运用堆分配。”看到我苍莽的双眼,大李笑了笑,在电脑上飞快地写了个示例:Class CHenry      Public z As Integer = 0      ‘能对非静态成员初始化也是一个差异  End Class  Sub main()    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可以支撑继承了,它是如何做到的呀!”VB.NET之旅(五)—类的继承“类的继承?”大李点容许,“早年许多人批评VB的功用不完善时,都会加上这个条件。可是如今VB.NET中现已是比较完善的面向方针编程方法了。刚才我们也说到过,类与VB.NET的计划类似,让我们可以定义封装一组有关项的数据类型。然而与计划的一个重要差异便是,VB.NET类可以继承和扩展其他类的特性。作为新类的基础的类称为‘基类’。从基类派生的类称为‘派生类’。派生类继承基类中定义的全部字段、特色、方法和作业。你看,我们只需对类进行一次开发和调试,就可以将其作为其他类的基础重复运用。”“类的继承的概念我学过的,在VB.NET中是如何来实习演练呢?”我仍是坚持着问。“我写段代码给你看一下吧,俗话不是说,百闻不如一见吗?”大李捉弄了两句,噼噼啪啪地初步敲打起键盘来:Public Class CBaseHenry    Private x As Integer = 10    Protected y As Integer    Sub New()      Console.WriteLine('基类的计划')    End Sub    Protected Overrides Sub Finalize()      Console.WriteLine('基类的析构')     MyBase.Finalize()    End Sub  Public Overridable Function GetY(ByVal x As Integer) As Integer    Me.y = me.x + x ‘private类型的me.x只能在基类中运用      Console.WriteLine('基类的GetY方法,作用为:' & Me.y)      Return Me.y    End Function    Public Sub OldY()      Console.WriteLine('基类的OldY方法')  End Sub  End Class“你看,这是一个基类,我再给你写个继承自该类的派生类。”他一边说一边继续写:Public Class CDerivedHenry    Inherits CBaseHenry    Sub New()      MyBase.New() ‘注意:这句话要放在sub内的第一句      Console.WriteLine('派生类的计划')    End Sub    Protected Overrides Sub Finalize()      Console.WriteLine('派生类的析构')      MyBase.Finalize()    End Sub    Public Overrides Function GetY(ByVal x As Integer) As Integer      Me.y = x * 10 ‘protected类型的me.y却可以在派生类中使用      Console.WriteLine('派生类的GetY方法,作用为:' & Me.y)      Return Me.y    End Function    Public Sub NewY()      Console.WriteLine('派生类的新方法')    End Sub  End Class“你看清了吧,我们通过声明Inherits要害字,来标识该类的基类是谁,如果没有标识的类,比如CBaseHenry,VB.Net就会视其为派生自Object基类,这是种隐式继承,和计划是隐式继承自ValueType类的方法是相同的。”大李指着屏幕跟我阐明着。“那这些overrides与overload标识是啥意思呀?”我模糊感触到它们的意义,却无法知道地说出来。“我们运用继承,也要容许派生类中的某些特色或方法有与基类不相同的举动,我们想‘重写’它,但基类也得要赞同你才华重写呀,否则不就会发生命名冲突了吗?因为派生类的方针是可以运用基类的共用成员的,那如何知道哪些基类的方法与特色是被派生类重写了呢?所以就有必要有一个约好:我们在基类顶用Overridable修饰符来标识容许基类中的特色或方法在其派生类中被重写,没有标识的其实便是默认为有NotOverridable修饰符来隐式地标识,用于提示编译器该特色或方法不可被重写;然后在派生类重写时,我们就用Overrides修饰符来标识哪些是重写自基类中定义的Overridable特色或方法。”大李娓娓道来,“我们来演练一下对派生类的操作吧。”Public Sub Main()    Dim obj As CDerivedHenry = New CDerivedHenry()    obj.GetY(4)  '调用派生类的GetY方法    obj.OldY()   '调用基类的oldY方法    obj.NewY()   '调用派生类的NewY方法  End Sub然后大李按了一下F5键,在“输出”窗口中就出现了如下的作业作用:  基类的计划          ‘开始作业New CDerivedHenry()    派生类的计划    派生类的GetY方法,作用为:40  ‘obj.GetY(4)的作业作用=4*10,不等于基类的(4+10)    基类的OldY方法        ‘obj.OldY()的作业作用    派生类的新方法        ‘obj.NewY()的作业作用    派生类的析构    基类的析构“你看,你只在Main中实例化了一个派生类的对象,为啥先会出现‘基类的计划’?”大李问。“这个么,”我初步在代码中检查起来,“是这句了。”我手指着派生类里的这段代码:Sub New()      MyBase.New() ‘注意:这句话要放在sub内的第一句      Console.WriteLine('派生类的计划')  End Sub“没错,我们有必要要注意这一点,便是派生类的计划函数与析构函数都有必要从头编写。New计划函数一般用于翻开文件、联接到数据库、初始化变量以及处置任何需要在可运用方针前结束的其他任务。我们有必要在Sub New计划函数中的第一行代码运用语句MyBase.New(),来调用类层次计划中该类的基类的计划函数,以获得基类的性质。析构则是在Sub Finalize中实行完对派生类的的收拾任务,如保管情况信息、关闭文件和与数据库的联接,以及实行在开释方针前有必要结束的其他任务之后,在析构函数的结束一句运用语句MyBase.Finalize()显式调用其基类的Sub Finalize方法,以析构MyBase.New ()计划的内容。所以你从程序作业作用中也可以很知道的看出这一次第。”大李敲击着屏幕,象是给我提个醒。“知道了,我会记取的。”我诚笃地址头回应着。大李俄然想起了啥,俯首对我说:“讲到类的继承,我们还得看一下重载与躲藏的疑问。”
推荐信息