VB.Net学习笔记(前言)

程序代码: [ 复制代码到剪贴板 ]

微软的.Net开发平台庞大且复杂,对于一般的开发人员来讲面临最现实的要求就是在短时间内掌握VB.Net的开发技巧,并希望找到一个捷径。虽然学习一门语言应该没有什么特别的捷径可以走(本人也不赞成所谓的21天精通***),但了解他人的学习方式和快速把握语言的重点还是有必要的。

我大约从2000年底开始接触.Net,几年来一直致力于.Net的开发和培训,或多或少也有了一些心得,现在写来为准备加入.Net战线的各位做一点贡献。



VB.Net学习笔记(基础概念和语法)

程序代码: [ 复制代码到剪贴板 ]
学一门语言,特别是现在都是可视化的开发了,但我建议还是不要急着先去拖拉几个控件,而是踏踏实实的先了解一下这门语言的概念、语法和规范。

VB.Net虽然和以前的VB6在语法上非常的接近,但由于现在的VB.Net是全新的面向对象的语言,所以两者还是有些区别的。

正如大家所知道的,现在VB.Net已经全面支持各种面向对象的特性了,并且还有了一些其他.Net环境所需要的特性:继承、重载、重写属性和方法、实现构造函数和析构函数、接口、委托、异常、命名空间、程序集、特征编程、多线程、共享成员。(我们在后面的笔记中会逐步的来探讨这些特征的。)

 

先简单的描述一下VB.Net的语法,虽然它和VB6是如此的象像。所以讲述VB.Net的语句其实是对VB6语句的回顾,但有些语句是原先VB6所没有的。

 

VB.Net语句分为:声明语句、赋值语句、条件语句、循环语句、数组处理语句、异常语句、控制流语句、调用语句、锁语句

 

 

声明语句
在VB.Net、中声明往往是指变量的声明。

对于局部变量我们使用Dim修饰符进行声明。并且依然可以使用Const来修饰该变量为常数,Static作为描述静态变量依然有效。

 

声明举例(对于类和数组我们在后面描述)
 
        Const s As String = "Hello" '常数局部变量

        Dim b As Boolean '规则局部变量

        Static i As Int32 '静态局部变量
 


 

变量的可访问性
上面的三个变量都是局部变量,我们知道局部变量只在声明它们的区域是可见的,在该范围外是无法访问的,对于那些需要更多访问的控制,VB.Net提供了更丰富的修饰关键字。

 

可访问性修饰
 描述
 
Public
 声明元素为公共的,对公共元素的可访问性没有限制。
 
Private
 声明元素仅可以从同一模块、类或结构内访问。
 
Protected
 声明元素仅可以从同一个类内,或该类的派生类中访问。
 
Friend
 声明元素可以从同一个项目内访问,但不能从项目外部访问。
 
Protected Friend
 声明元素可以从派生类或同一项目内或二者进行访问。
 


 

可访问性举例(注意TestB,TestC和TestA的关系)
 
Public Class TestA

    Public i As Int32 = 100 '访问无限制

    Private s As String = "Hello" '只有TestA可以访问

    Protected b As Boolean = True '只有TestA和它的派生类可以访问

    Friend d As Double = 3.1415926 '只有同项目类可以访问

    Protected Friend l As Long = 100000 '

End Class

 

 

Public Class TestB

    Inherits TestA'继承TestA

    Public Sub New()

        MyBase.b = False

        MyBase.d = 3.14

        MyBase.i = 10

        MyBase.l = 10000

    End Sub

End Class

 

 

Public Class TestC

    Public Sub New()

        Dim a As New TestA

        a.d = 3.14

        a.i = 10

        a.l = 1000

    End Sub

End Class
 



VB.Net学习笔记(变量生存期和赋值)


程序代码: [ 复制代码到剪贴板 ]
变量有生存周期
这一点程序员们都了解,在VB.Net中增加了一个修饰Shared。Shared 关键字指示一个或多个被声明的编程元素将被共享。要点是:共享元素不关联于某类或结构的特定实例。需要通过使用类名或结构名称或者类或结构的特定实例的变量名称限定共享元素来访问它们。简单的描述就是Shared变量是为类型本身服务而不是为特定对象服务的。

 

Shared举例
 
Public Class TestA

    Public Shared i As Int32 = 10

End Class

 

 

Public Class TestB

    Inherits TestA '继承TestA

    Public Sub New()

        TestA.i = 100 '使用类型的名字进行访问Shared变量

    End Sub

End Class
 

 

要注意的是,在VB.Net中Shared变量与类型和实例的关系在语法上要求似乎并不特别严格,程序员可以使用类型的实例来访问并修改Shared变量,但在C#中要求就很严谨了。

 

 

 

赋值语句
在VB.Net中赋值语句分为:简单赋值语句、复合赋值语句、委托赋值语句、Mid赋值语句。

简单赋值语句
简单赋值语句和以前的VB赋值语句基本上没有太大的区别,只是现在VB.Net允许对变量声明后就立即赋值了(在前面可访问性举例可以看到示例)。我们需要关注的是数组的声明和赋值方法。

在VB.Net中你可以在声明数组时同时描述数组的纬度和上限,且每一个数组的纬度的下限都是0,不可以改变。但可以通过将数组的上限指定为 -1 来指定“零长度数组”。这种数组不包含任何元素。

如果不显示的描述数组的长度,你可以在声明数组的同时立即赋值。

 

数组的声明和赋值举例
 
Public Class TestA

    Dim iArr() As Int32

    Dim bArr(5) As Boolean '5是指bArr下标的上限,即可以有6个元素

    Dim lArr() As Long = New Long(3) {100, 200, 300, 400}

    Dim cArr() As String = New String() {"A", "B", "C"}

    Dim dArr(-1) As Double

End Class
 

 

关于数组的更多特性,在后期关于数组的介绍中将详细阐述。

 

复合赋值
现在VB.Net开始支持复合赋值语句。与完全展开的表达式不同,复合赋值语句左侧的变量仅计算一次。这意味着在运行时,变量表达式先于赋值语句右侧的表达式计算。

 

复合赋值举例
 
Public Class TestA

    Public Sub New()

        Dim i As Int32

        i += 10

    End Sub

End Class
 

 

Mid赋值
Mid赋值实际上是字符串的处理赋值过程。通过以下的举例可以了解Mid的赋值方式。

 

Mid举例
 
Public Class TestA

    Public Sub New()

        Dim TmpStr As String

        TmpStr = "Hello VB.Net" ' Hello VB.Net

        Mid(TmpStr, 7, 2) = "c#" ' Hello c#.Net

        Mid(TmpStr, 7) = "VB6" ' Hello VB6Net

        Mid(TmpStr, 7) = "VB6 to VB.Net" ' Hello VB6 to

        Mid(TmpStr, 7, 3) = "VB6 to VB.Net" 'Hello VB6 to

    End Sub

End Class
 

 

 

关于委托语句的关键字AddressOf在后期委托和事件中讲详细描述。


VB.Net学习笔记(条件语句)

程序代码: [ 复制代码到剪贴板 ]
条件语句
VB.Net中条件语句依然是If Then语句和Selecr Case语句。

 

If Then语句
If Then语句比较简单,和原来一样的规则。

 

If条件语句举例
 
Public Class TestA

    Public Sub New()

        Dim b As Boolean = True

        If b = True Then

            '处理

        Else

            '处理

        End If

 

    End Sub

End Class
 

 

Select Case
Select Case语句用于条件的多个结果的分支判断执行。值得注意的是:Seleect Case的判断表达式必须计算为某个基本数据类型(Boolean、Byte、Char、Date、Double、Decimal、Integer、Long、Object、Short、Single 和 String)。

VB.Net的Case 块的执行不能“贯穿”到下一个 switch 节。这称为“无贯穿”规则。所以不需要有Break跳出Case块。

Case字句可以是单一的变量,也可以是To和Is的混合表达式。

 

Select Csae举例
 
Public Class TestA

    Public Sub New()

        Dim i As Int32 = 100

 

        Select Case i

            Case 1, 3, 5, 7

                '处理

            Case 8 To 12

                '处理

            Case 13 To 21, 25

                '处理

            Case 31 To 35, 39, Is > 50

                '处理

        End Select

    End Sub

End Class
 


VB.Net学习笔记(循环语句)

程序代码: [ 复制代码到剪贴板 ]
循环语句
 

VB.Net中的循环语句分为:Do While Loop、For Next、For Each三种。

 

Do While Loop
Do While Loop有三种形式,这系列的循环是用于预先不知道循环的上限时使用的。在使用Do While Loop语句时要注意,因为它们是不确定循环次数,所以要小心不要造成死循环。

 

Do While Loop举例
 
Public Class TestA

    Public Sub New()

        Dim i As Int32

 

        i = 1

        Do While i < 100 '先判断后执行

            i += 1

            Exit Do

        Loop

 

        i = 1

        Do

            i += 1

            Exit Do

        Loop While i < 100 '先执行后判断

 

        While i < 100 'Do While i < 100

            i += 1

            Exit While

        End While

 

    End Sub

End Class
 

 

 

 

For Next
和Do While Loop不一样,For Next是界限循环。For 语句指定循环控制变量、下限、上限和可选的步长值。

 

For Next举例
 
Public Class TestA

    Public Sub New()

        Dim i As Int32

 

        For i = 0 To 100 Step 2

 

        Next i

 

    End Sub

End Class
 

 

 

For Each
For Each也是不定量循环, For Each是对于集合中的每个元素进行遍历。如果你需要对一个对象集合进行遍历,那就应该使用For Each。

 

For Each举例
 
Public Class TestA

    Public Sub New()

        Dim Found As Boolean = False

        Dim MyCollection As New Collection

        For Each MyObject As Object In MyCollection

            If MyObject.Text = "Hello" Then

                Found = True

                Exit For

            End If

        Next

 

    End Sub

End Class
 

 

 

简单的语句介绍,我们就到这里了,其他语句在以后对VB.Net的逐步深入中,我们会一一阐述。


VB.Net学习笔记(数组)


程序代码: [ 复制代码到剪贴板 ]
数组
 

在VB.Net中数组有了很大的改变。首先象在简单赋值章节描述的:数组的索引编号总是从零开始;并且数组的元素类型是强类型,即数组中所包含的每一个元素都必须是相同的类型。

Array对象
在VB.Net中使用Dim iArr(5) As Int32这种语法表示的数组实际上是声明了一个Array对象的实例。Array对象是位于System命名空间中。这个对象提供创建、操作、搜索和排序数组的方法,因而在公共语言运行库中用作所有数组的基类。不过虽然Array 类是支持数组的语言实现的基类。但是,只有系统和编译器能够从 Array 类显式派生。用户应当使用语言提供的数组构造。Array对象提供了一些重要的属性和方法,来便于我们操作数组。

 

Array数组操作举例
 
        Dim iArr(5) As Int32 'iArr.Length=6

        Dim bArr(5, 5) As Boolean 'bArr.Rank=2,bArr.Length=36

 

 

        Array.Clear(iArr, 0, iArr.Length - 1)

 

        For i As Int32 = iArr.GetUpperBound(0) To 0 Step -1 'iArr.GetUpperBound(0)=5

            '数组的元素为

            iArr.SetValue(i, i)

        Next

 

        Array.Sort(iArr) '数组元素经过排序后为0,1,2,3,4,5

 

        For i As Int32 = 0 To iArr.GetUpperBound(0)

            '输出数组元素

        Next
 

 

 

ArrayList对象
Ayyar的容量是固定的,VB.Net提供的ReDim语句实际上是利用了ArrayList对象的能力。ArrayList是Array的复杂版本。ArrayList其实是把Array当作集合处理,当然就可以将容量根据需要进行自动扩展了。ArrayList既然是以集合的方式处理,所以它当然位于System. Collections 命名空间中了。

不过Array相对于ArrayList来讲也有其优势:Array可以有多个纬度,但ArrayList只可以有一个纬度。在Array的元素中值类型不需要进行装箱和卸箱的操作,所以在值类型方面,Array比ArrayList具有高的多的效率。(数据类型将在后期的类型章节描述。)

 

使用ArrayList对象更改Array对象容量大小举例
 
Dim iArr(5) As Int32

 

        For i As Int32 = 0 To iArr.GetUpperBound(0)

            iArr.SetValue(i, i) '0,1,2,3,4,5

        Next

 

        Dim iArrList As New System.Collections.ArrayList(iArr) 'iArrList.Count=6

        For i As Int32 = 6 To 10

            iArrList.Add(i)

        Next 'iArrList.Count=11

        iArrList.Insert(5, 99) 'iArrList.Count=12

        iArrList.Capacity = 100 'iArrList.Count=12

        iArrList.TrimToSize() 'iArrList.Count=12

        iArr = iArrList.ToArray(GetType(Int32))

        For i As Int32 = 0 To iArr.GetUpperBound(0) 'iArr.GetUpperBound(0)=11

            '输出:0,1,2,3,4,99,5,6,7,8,9,10

        Next
 

 

数组声明指定需要一个数据类型(可将数组声明为任何基本数据类型、结构或者对象类),数组的所有元素必须都是该类型数据。但是如果数据类型是 Object,则单个数组元素可以包含各种类型的数据(如对象、字符串、数字等等)。


VB.Net学习笔记(数据类型基础)


程序代码: [ 复制代码到剪贴板 ]
讨论数据类型
 

.Net中的数据类型是程序员需要认真掌握的基础知识。.NET 中类型的两个基本类别是“值类型”和“引用类型”。基元类型、枚举和结构为值类型。类、字符串、标准模块、接口、数组和委托为引用类型。

所有的类型要么是值类型,要么是引用类型,但有一种情况例外。根类型 System.Object ,它非常特殊,因为它既不是引用类型也不是值类型,而且不能实例化。因此,类型 Object 的变量可包含值类型或引用类型。

不过无论值类型还是引用类型,它们的声明方式都是一样的,当然它们的语义是不同的。

 

 

值类型
 

值类型直接存储在堆栈上,要么在数组中,要么在另一个类型中。值类型总是直接访问;不可能创建对值类型的引用。值类型的值不能为空引用,值类型的变量赋值会创建所赋的值的副本。

 

值类型副本创建意义举例
 
        Dim i As Int32 = 10

        Dim j As Int32 = i

        j = 20 'i=10
 

 

 

基础类型
什么是基础类型呢?简单的讲就是如果一个类型的值是可以使用常数来描述的,该类型就是基础类型。当表达式的操作数均为基元类型常数时,编译器是可以在编译时计算表达式的。这种表达式被称为常数表达式。基本类型总是有初始值的。

 

VB.Net定义的基础类型:整数(包括字节),浮点、布尔、日期、字符和字符串。

 

分类
 类型
 存储分配
 
整数值类型
 Byte
 1
 
Short
 2
 
Integer
 4
 
Long
 8
 
浮点值类型
 Single
 4
 
Double
 8
 
Decimal
 16
 
布尔
 Boolean
 2
 
日期
 Date
 8
 
字符
 Char
 2
 
字符串
 String
 取决于实现平台
 

 

如果大家有心的话,可以从Boolean和Char的分配空间看出:.Net是基于Unicode来表示数据的,所以在.Net中英文字符和中文字符所占的空间是一致的。



VB.Net学习笔记(面向对象的基本数据类型)


程序代码: [ 复制代码到剪贴板 ]
这些基本类型也象类一样拥有各自的方法和属性,熟练运用它们能让你的程序更优雅和更有面向对象的味道。

 

基本类型的重要方法和属性举例
 
        Dim i As Int32

        Dim s As String

        Dim ss() As String

        Dim by As Byte

        Dim d As Double

        Dim b As Boolean

        Dim da As Date

        Dim c As Char

        Dim cc() As Char

 

        '整数操作

        i = Int32.Parse("¥123", Globalization.NumberStyles.AllowCurrencySymbol) '123

        i = Int32.MaxValue '2147483647

        i = Int32.MinValue '-2147483648

        by = Byte.Parse("1") '1

        '浮点数操作

        d = Double.PositiveInfinity '正无穷大

        d = Double.Epsilon '4.94065645841247E-324

        '布尔操作

        s = Boolean.TrueString 'True

        '日期操作

        da = Date.MaxValue '9999-12-31 23:59:59

        da = Date.MinValue '0:00:00

        da = Date.Now '2004-5-7 13:17:35

        b = Date.IsLeapYear(2004) 'True

        i = Date.DaysInMonth(2004, 5) '31

        '以下方法用于判断字符的特性

        Char.IsControl(c)

        Char.IsDigit(c)

        Char.IsLetter(c)

        Char.IsLetterOrDigit(c)

        Char.IsLower(c)

        Char.IsNumber(c)

        Char.IsPunctuation(c)

        Char.IsSeparator(c)

        Char.IsSurrogate(c)

        Char.IsSymbol(c)

        Char.IsWhiteSpace(c)

        Char.IsUpper(c)

        'Char转换

        Char.ToLower(c)

        Char.ToUpper(c)

        '字符串操作

        cc = s.ToCharArray()

        ss = s.Split(",")

        s = s.Substring(5, 3)

        s = s.Trim()