【VB.NET】基础汇总

A.0 如何在VS中写VB.NET代码
请走传送门


A.1 构造和析构

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

构造函数:
New()
MyBase.New() 基类显式调用
MyBase 是System.Windows.Forms.Form类的实例化对象

析构函数:
Dispose()
Form.Dispose方法重写自Control.Dispose方法
释放由Control占用 的非托管资源,还可以另外再释放托管资源.


A2. 共享成员

敲黑板,重点,此处是重点。

VB.NET现在是支持真正的面向对象编程,可以继承、使用多态、共享成员和静态成员。

共享成员就是在所有类和所定义派生类的实例之间共享的方法、属性、字段和事件。所有使用类创建的对象都可以访问相同的数据、共享实现过程 ,并且收到相同的激发事件。

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

有两个要点:

第一个是共享成员如果是方法或属性,我们不用创建实例就可以直接用 ‘类名.共享成员’的方法进行调用;
第二个要点,共享字段是唯一的。


A3. 类和结构

结构与类有什么相似之处与不同之处吗 ?

相似之处:它们都含有成员,包括构造函数、方法、属性、字段、常量、枚举和事件。都可以实现接口,都有共享的构造函数。

不同之处:内存分配大不同。结构是值类型,而类是引用类型。因此,结构使用堆栈分配,类使用堆分配。

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

我们通过声明Inherits关键字,来标识该类的基类是谁,如果没有标识的类,比如CBaseHenry,VB.Net就会视其为派生自Object基类,这是种隐式继承,和结构是隐式继承自ValueType 类的方式是一样的。

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

A4. 重载和隐藏

重写,就是刚才举的示例中,在派生类中用Overrides重新编写有Overridable标识的基类的方法或属性;重载么, 就是我们可以用同样的名称,在调用时可以适应不同参数类型的要求。我们用 overloads方式,隐藏了基类的同名方法。以防用户发生混淆。

隐藏有两种情况:
1.用局部变量x在方法中隐藏了全局变量x。
2.通过继承来隐藏,方法么,除了刚才用的overloads,还可以用Shadows关键字来实现。

Public Class CBaseHenry 
 
  Public Sub oldY() 
 
    Console.WriteLine("基类的oldY方法") 
 
  End Sub 
 
End Class 
 
Public Class CDerivedHenry 
 
  Inherits CBaseHenry 
 
  Public Shadows Sub oldY(ByVal j As Integer) 
 
    Console.WriteLine("派生类的oldY方法") 
 
  End Sub 
 
End Class 
 
Public Sub Main() 
 
  Dim obj As CDerivedHenry = New CDerivedHenry()
  ... ... (之后的代码略,因为不重要)

隐藏适用于任何元素类型,你可以在派生类中 用Public Shadows oldY as Integer来隐藏基类的oldY()方法;而重写只能适用 于方法与属性,而且声明参数与修饰符都要求完全一致。

当派生类又派生出一个子类时,重写与隐藏都会被继承下去。当然,如果在派生类中是用private来修饰Shadows成员的话,它的子类就会继承它基类的成员了。


A5. 脆弱的基类

如果我在基类中更改了成员的数据类型,以及那些允许重写的那些方法和属性, 那派生类及其子类还能正常工作吗?尤其是当一个团队中的多个开发人员一起来 创作基类和派生类时,就更是要命了。很多情况下,大家可能已经把基类和一些 派生类编译成二进制形式进行提交了。更改基类,重新编译再分布,会牵一发而动全身,导致项目的崩溃。所以我们把这叫做‘脆弱的基类’。也就是说,它是整个工程中最薄弱最致命的环节。

私以为可以采用依赖倒转原则,应该依赖于抽象而不是依赖于细节编程。

一般来说,是有这样几个准则需要把握的:

第一,遵循先通用,再专用的原则。先设计好层次结构中每一级别的类中的通用部分,也 就是提供给派生类继承的成员和标识为Public的成员;

第二,在定义数据 类型和存储区时要有预留量,以避免以后更改困难。例如,即使当前数据可能仅 需要Integer类型就够了,在设计时我们使用 Long 类型的变量。当然,最好能物 尽其用,也不要盲目放大;

第三,在一个项目中,必须统一管理与分配团队中使用的所有的命名,以减少命名冲突,这一点其实事关重大;

第四, 要使用提供可行的最低访问权限的访问修饰符声明类成员。内部类成员应声明为 Private;仅在类内与派生类才需要的成员应标记为Protected;Friend 数据成员 可以从类的外部访问,但仅限于该模块是定义该类的项目的一个组成部分;使用 Public标识的成员,只能是实例化时真正需要的内容,而且经常用在类层次结构的底部。


学习笔记未完待续,很多知识点只是搬运工,博主表示并不懂,后期进行整理,添加自己的理解。
您的评论是我持续写文的动力之一。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值