visual basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/dotnet/vb.pdf · 编译和执行...

99
Visual Basic.NET 概述 VB.NET举例 VB.NET的数据类型 VB.NET程序语句 其他特性

Upload: vongoc

Post on 06-Feb-2018

241 views

Category:

Documents


15 download

TRANSCRIPT

Page 1: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

Visual Basic.NET

概述

VB.NET举例

VB.NET的数据类型

VB.NET程序语句

其他特性

Page 2: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET概述

Visual Basic .NET 是新一代的 Visual Basic 语言,它是一种简便快捷地创建基于 .NET 的应用程序(包括 XML Web services 和 Web 应用程序)的工具。

Visual Basic .NET 具有许多功能(包括继承、接口和重载、自由线程处理和结构化异常处理、集成了 .NET Framework 和公共语言运行库等),使之成为一种强大的面向对象编程语言。

Page 3: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET概述

Visual Basic .NET 反映了下列设计原则: 它是明显的 Visual Basic 衍生语言。现有的 Visual

Basic 程序员可在非常短的时间内熟悉该语言。 它的语法和语义简单、直接且容易理解。该语言中避免

了非直观的功能。 它为开发人员提供了 .NET Framework 的主要功能,

而且符合框架的约定。 由于 .NET Framework 显式支持多种计算机语言,因

此它可在多语言环境中很好地工作。 它尽可能同 Visual Basic 的早期版本兼容。在可行的条

件下,Visual Basic .NET 同它的早期语言具有相同的语法、相同的语义和相同的运行时行为。它可从 Visual Basic 合理地升级。

Page 4: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET概述

以下原则使 Visual Basic 原来的设计原则更加完善:

它是一种在编写时尽可能安全的语言。一般情况下,Visual Basic 会尝试在语言定义中使可靠性、易用性和效率三者相互平衡。

它是一种极其友好的语言。

它生成可预知的高效代码。

它既可充当强类型语言,又可充当松散类型语言,在前者中可实现更正确的用户代码,在后者中则可实现更快的开发速度。

它支持快速的程序开发,同时兼顾可靠性。

Page 5: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

' A "Hello World!" program in VB.NETImports SystemImports Microsoft.VisualBasicModule Hello

Sub Main()MsgBox("Hello World!") ' Display

message on computer screen.End Sub

End Module

Page 6: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

注释

单引号 (‘) 表示此行的其余部分为注释 。可以将整行作为注释,或者可以在其他语句的结尾追加一个注释,如:

MsgBox("Hello World!") 'Display message on computer screen.

Imports 语句

允许您在不使用全限定名的情况下引用命名空间中的类。

Module(模块)

在 Visual Basic 中,所有的过程或函数都必须封装在类或模块中。一个类可以有多个实例(带有成员变量和过程或函数)。然而,模块只包含过程或函数,并且不能进行实例化。就 Hello World 应用程序来说, Hello模块包含一个过程,即 Main()过程。

Page 7: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

输入和输出

本例使用标准的 VB 运行时库,它在整个Microsoft.VisualBasic 命名空间内可用。可以使用所有的 Microsoft.VisualBasic 过程和属性,而无须将其导入程序。

MsgBox 函数来显示包含字符串 Hello World! 的消息框

Page 8: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

Main 过程

每个VB程序必须包含一个称为 Main 的过程,该过程为应用程序的起始点并为应用程序提供总体控制。当加载模块时,将调用该过程。

如果要在类中声明 Main 过程,必须使用Shared 关键字。在模块中,Main 不必是Shared。

有四种方法可以声明 Main 过程,如下所示:

Page 9: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序 最简单的方法是声明一个不带参数或不返回值的 Sub 过

程,如前面的控制台程序示例中所示:Sub Main()

‘ .......End Sub

Main 还可以返回一个 Integer 值,操作系统将其作为程序的退出代码。其他程序可以通过检查 Windows ERRORLEVEL 值来测试该代

码。若要返回退出代码,必须将 Main 声明为 Function 函数而不是 Sub 过程,如下所示:

Function Main() As Integer' Display message on computer screen. MsgBox("Hello World!")' Zero usually means successful completion. Return 0

End Function

Page 10: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

Main 还可以采用一个 String 数组作为参数。数组中的每个字符串均包含一个用于调用程序的命令行参数。若要获取命令行参数,以如下方式声明 Main:Function Main(ByVal CmdArgs() As String) As Integer

Dim ArgNum As Integer If CmdArgs.Length > 0 Then ' See if there are any arguments.For ArgNum = 0 To UBound(CmdArgs)

' Examine CmdArgs(ArgNum) for settings you need to handle.

System.Console.WriteLine(CmdArgs(ArgNum))Next ArgNum

End IfMsgBox("Hello World!") ' Display message on computer screen.

Return 0 ' Zero usually means successful completion.End Function

Page 11: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

可以声明 Main 来检查命令行参数而不返回退出代码,如下所示:

Sub Main(ByVal CmdArgs() As String)‘ ......

End Sub

Page 12: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

编译和执行可以使用 Visual Studio .NET 集成开发环境 (IDE) 或命

令行来编译“Hello World!”程序。

从命令行编译并运行程序

使用任意一种文本编辑器创建源文件,并将其保存为名如Hello.vb 的文件。

若要调用编译器,请输入下面的命令: vbc Hello.vb 若程序不包含任何编译错误,则编译器创建一个

Hello.exe 文件。

若要运行程序,请输入下面的命令: Hello

Page 13: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例 - “Hello World!”程序

从 IDE 编译并运行程序

创建一个 Visual Basic 控制台应用程序项目。

将代码复制到项目中。

从“生成”菜单选择适当的“生成”命令,或按 F5 来生成并运行(对应于“调试”菜单中的“启动”)。

程序可加命名空间

Page 14: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET程序结构

Visual Basic 程序的结构编写的任何代码都必须按照以下顺序:

1. Option 语句

2. Imports 语句

3. Main 过程 (包含在类或模块中)4. 若适用,还有 Class、Module 和 Namespace 语

句。

此外,一个程序可以包括条件编译语句。这些语句可以放置在模块的任何位置。

如果以其他顺序输入语句则会产生编译错误。

Page 15: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET程序结构 Option 语句:

为后续的代码建立基本的规则,以防止语法和逻辑错误。 Option Explicit 语句:用于在文件级强制对该文件中的所有变量进

行显式声明。默认为 On。 Option Strict 语句:限制隐式数据类型转换只能是“拓宽”转换。

可防止在使用不同类型的变量时发生逻辑错误和数据丢失。默认为Off。

Option Compare 语句指定字符串进行相互比较的方法:按它们的Binary 排列或 Text 排列。

Option Compare Binary ' That is, "AAA" is less than "aaa".Option Compare Text ' That is, "AAA" is equal to "aaa".

Option Infer 语句(VS2008):在变量声明过程中启用局部推断类型。默认值为 On。对于从早期版本升级的项目,默认值为 Off。

可通过选项”对话框 ->“项目”->“Visual Basic 默认值” 或“项目”->“属性”->“生成”设置

VS2005/VS2008中,在“工具”菜单上选择“选项”。打开“项目和解决方案”节点;选择“VB 默认值”;修改“Option Explicit”设置。

Page 16: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET程序结构

Imports 语句:

允许对类和其他定义于导入命名空间的类型进行命名,而无须对它们进行限制。

Main 过程:

是应用程序的起始点,即运行代码时访问的第一个过程。

Class、Module 和 Namespace 语句:

类和模块占源文件代码最大的部分。它们包含您所编写的大部分的代码(主要是 Sub、Function、Method 和 Event 语句)和变量声明以及程序运行所需的其他代码。

条件编译语句条件编译语句可以出现在模块的任何位置。它们被设置为运行中

满足某一条件时执行。也可以将它们用于调试应用程序,因为条件代码只在调试模式中运行。如:

Page 17: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET程序结构#Const CustomerNumber = 36#If CustomerNumber = 35 Then

' Insert code to be compiled for customer # 35.......

#ElseIf CustomerNumber = 36 Then' Insert code to be compiled for customer # 36.......

#Else' Insert code to be compiled for all other customers.......

#End If

Page 18: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例2

'VB.net ExampleModule DisplayValues

Interface IMath

Function Fac(ByVal pintT As Integer) As Integer

Function Sqrt(ByVal pdblT As Double) As Double

End Interface

Page 19: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例2Public Class Computer

Implements IMathPublic Function Fac(ByVal pintT As Integer) As Integer

Implements IMath.FacDim intCt As Integer,intRes As Integer = 1For intCt = 2 To pintT

intRes *= intCtNextReturn intRes

End FunctionPublic Function Sqrt(ByVal pdblT As Double) As Double

Implements IMath.SqrtReturn System.Math.Sqrt(pdblT)

End FunctionEnd Class

Page 20: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例2Sub Main()

Dim objT As Computer = New ComputerDim intT As IntegerintT = 5System.Console.WriteLine("Sqrt root of

{0}:{1:f4}", intT, objT.Sqrt(intT))End Sub

End Module

Page 21: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET举例2

VB.NET的缺省参数传递方式是传值(By Value)

Implements:每个函数都必须显示标明其实现的接口成员。函数名与接口成员可不同

VB.NET类是CTS类的一个具体表达

VB大小写不敏感

Page 22: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型

VB.NET支持两种类型:“值类型”和“引用类型”。值类型包括基元类型(如 Char、Integer 和 Single)、枚

举类型和结构类型。

引用类型包括类 (Class) 、字符串、标准模块、接口、委托和数组。

所有的类型要么是值类型,要么是引用类型,但有一种情况例外。根类型 Object 是 System.Object 的别名,它非常特殊,它既不是引用类型也不是值类型,Object的变量可包含值类型或引用类型。

Page 23: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型下面的示例显示了“值类型”和“引用类型”的差异:(ValRef.vb)Imports SystemClass Class1

Public Value As Integer = 0End Class

Module TestSub Main()

Dim val1 As Integer = 0Dim val2 As Integer = val1val2 = 123Dim ref1 As New Class1()Dim ref2 As Class1 = ref1ref2.Value = 123Console.WriteLine("Values: " & val1 & ", " & val2)Console.WriteLine("Refs: " & ref1.Value & ", " & ref2.Value)

End SubEnd Module

Page 24: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型

程序的输出是:

Values: 0, 123 Refs: 123, 123

局部变量 val2 赋值不影响局部变量 val1,因为两个局部变量同属于一种值类型(Integer 类型),而一种值类型的每个局部变量都有它自己的存储。相反,赋值 ref2.Value = 123; 则会影响 ref1 和 ref2 都引用的对象。

Page 25: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 基元类型

Visual Basic .NET 定义了下列基元类型:

整数值类型

Byte(1 字节无符号整数)

Short(2 字节有符号整数)

Integer(4 字节有符号整数)

Long(8 字节有符号整数)。

这些类型分别映射到CTS的System.Byte、System.Int16、System.Int32 和System.Int64。整型的默认值等于 0。

Page 26: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 基元类型

浮点值类型

Single(4 字节浮点)

Double(8 字节浮点)

这些类型分别映射到 CTS的System.Single 和System.Double。浮点类型的默认值与文本 0 等效。

Decimal 类型(16 字节十进制值)

此类型映射到CTS的System.Decimal。十进制的默认值与文本 0D 等效。(在文本后追加文本类型字符 D 可将其强制转换为 Decimal 数据类型。)

Page 27: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 基元类型

Boolean 值类型表示真值,通常为关系运算或逻辑运算的结果。该文本属于类型 System.Boolean。Boolean 类型的默认值等于 False。

Date 值类型,表示日期和/或时间,映射到System.DateTime。Date 类型的默认值等于 # 01/01/0001 12:00:00AM #。

Char 值类型,表示单个 Unicode 字符,映射到System.Char。Char 类型的默认值等于常数表达式ChrW(0)。

String 引用类型,表示 Unicode 字符序列,映射到System.String。String 类型的默认值为空引用。

Page 28: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型

VB.NET并未支持所有CTS的类型

如无符号整数等。但VB.NET可声明这种类型:

Dim uintT As System.UInt32

Page 29: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 枚举

枚举枚举是从 System.Enum 继承的类型,象征性地表示

某个基元整型的值集。枚举的基础类型必须为一个可表示枚举中定义的所有枚

举值的整型(Byte、Short、Integer 或 Long)。如果未显示指定基础类型,则默认值为 Integer。

枚举声明语法:[ 特性 ] [ 枚举修饰符+ ] Enum 标识符 [ As 整型

名 ] 枚举成员声明+

End Enum

Page 30: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 枚举

下面的示例声明了一个基础类型为 Long 的枚举:Enum Color As Long

RedGreen = 10Blue

End Enum缺省枚举值从零开始,后面的成员值加 1;也可指定。

Dim a As Color = Color.BlueConsole.WriteLine(a) ‘输出11Console.WriteLine(a.ToString()) ‘‘输出Blue

Page 31: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 结构

结构结构与类的相似之处是,它们均表示可包含数据成员和函数成员的数据结

构。但与类不同的是,结构是值类型,不需要堆分配。结构类型的变量直接包含结构的数据,而类类型变量包含数据引用,后者称为对象。结构从 System.ValueType 继承,并且不能被继承。

结构声明语法:[ 属性 ] [ 结构修饰符+ ] Structure 标识符

[ 类型 Implements 子句+ ][ 结构成员声明+ ]

End Structure 行结束符如:Structure Point

Public x, y As IntegerPublic Sub New(x As Integer, y As Integer)

Me.x = xMe.y = y

End SubEnd Structure

Page 32: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 类

类类是可以包含数据成员、函数成员以及嵌套类型的数据结构,其

中数据成员包括常数、变量和事件,函数成员包括方法、属性、索引器、运算符和构造函数。

类类型支持单一继承,可实现多接口。类为引用类型。类声明语法:

[ 特性 ] [ 类修饰符+ ] Class 标识符[ 类基 ][ 类型 Implements 子句+ ][ 类成员声明+ ]

End Class 行结束符

(举例exam)VB.NET在2003版中不支持操作符重载VB.NET在2005版中支持操作符重载

Page 33: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 类

与类有关的一些关键字

VB.NET C#Overridable virtualNot Overridable FinalMustOverrides Abstract (用于方法)MustInherit Abstract (用于类)NotInheritable Sealed

Page 34: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 标准模块

标准模块标准模块为引用类型,其成员隐式地为 Shared,而且成员

范围为标准模块包含命名空间的声明空间,而不仅是标准模块声明本身。

标准模块永远不能实例化。即声明标准模块类型的变量是无效的。

命名空间中的多个标准模块可以定义具有特定名称的成员;对任何模块外部的名称进行非限定引用都是多义的。

模块只能在命名空间中声明,而且不能嵌套在其他类型中。标准模块不能实现接口,它们隐式地从 Object 派生,而且它们只有 Shared 构造函数。

Page 35: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 标准模块

标准模块声明语法:

[ 特性 ] [ 访问修饰符] Module 标识符[ 模块成员声明+ ]

End Module如:

Public Module Module1' Add classes, properties, methods, fields, and events for this module.

End Module模块使用举例:

Page 36: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 标准模块Imports SystemImports Microsoft.VisualBasicModule testSub Main()

test2.t()end sub

End Module

Module test1sub t()

msgbox("123")end sub

End Module

Module test2sub t()

msgbox("456")end sub

End Module

Page 37: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 接口

接口

接口是其他类型为确保它们支持某些操作而实现的引用类型。接口从不直接创建而且没有实际的表示形式,其他类型必须转换为接口类型。

一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以包含方法、属性、索引器和事件作为成员。

语法:

[ 特性 ] [ 接口修饰符+ ] Interface 标识符[Inherits 父接口+ ][ 接口成员声明+ ]

End Interface

Page 38: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 接口

如:显示一个包含默认属性、事件 E、方法 F 和属性P 的接口:

Interface IExampleDefault Property Item(index As Integer) As String

Event E()Sub F(ByVal Value As Integer)Property P() As String

End Interface

Page 39: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 接口

接口可以使用多重继承。 如:Interface IControl

Sub Paint()End Interface Interface ITextBox

Inherits IControlSub SetText(text As String)

End Interface Interface IListBox

Inherits IControlSub SetItems(items() As String)

End Interface Interface IComboBox

Inherits ITextBox, IListBoxEnd Interface

Page 40: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 接口类和结构可实现多个接口。在下面的示例中,类 EditBox 从类 Control 派生,

并同时实现 IControl 和 IDataBound:Interface IDataBound

Sub Bind(b As Binder)End Interface

Public Class EditBoxInherits Control ‘基类的出现必须先于接口Implements IControlImplements IDataBoundPublic Sub Paint() Implements IControl.Paint

...End SubPublic Sub Bind(b As Binder) Implements IDataBound.BindEnd Sub

End Class

Page 41: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

数组

数组是一种引用类型,它包含多个通过“索引”访问的变量,该索引以一对一的方式对应于数组中的变量顺序。(与Visual Basic 的早期版本不同,在 Visual Basic .NET 中,数组索引的编号总是从零开始。)数组中包含的变量(又称数组的“元素”)必须具有相同的类型,该类型称为数组的“元素类型”。数组元素在数组实例创建时出现,在数组实例销毁时消失。每个数组元素都初始化为其类型的默认值。类型 System.Array 是所有数组类型的基类型,不能实例化。每个数组类型继承由System.Array 类型声明的成员,并且可以转换为它(和 Object)。

Page 42: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

Visual Basic 中与数组相关的关键字有:

Dim、Private、Public、ReDim:声明和初始化数组

IsArray:验证数组

LBound、UBound:查找数组的限制

Erase、ReDim:重新初始化数组

Page 43: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

声明数组变量数组变量的声明与其他变量的声明一样,使用 Dim 语句。在变量

名后加上一对或几对圆括号,即可表示它是数组。 声明单维数组变量

在声明中,在变量名后添加一对圆括号,如:Dim MySingleArray() As Integer

声明多维数组变量在声明中,在变量名后添加一对圆括号并将逗号置于圆括号中以分隔

维数,如:Dim My4DArray(,,,) As Short ' Four-dimensional array.

声明交错数组变量在声明中,在变量名后添加的圆括号对数与嵌套数组的级数相同,如:Dim MyJaggedArray()()() As Byte ' Array of arrays of Byte

arrays.

Page 44: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

初始化数组可以将一个数组变量初始化为声明的一部分。在声明语

句中可以进行下列操作之一: 在变量名后跟的圆括号中指定一个或几个维度的初

始长度,不必为变量分配数组对象。' Currently contains Nothing (no object).Dim BA1(2) As Byte

使用 New 子句为变量分配数组对象。使用 New子句时,其后必须跟随花括号 ({}),即使当它们为空时也是如此。' Empty Byte array object.Dim BA2() As Byte = New Byte() {}

Page 45: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

初始化数组 (续) 为变量分配一个数组对象,并在 New 子句中提供

初始长度。Dim BA3() As Byte = New Byte(2) {}

为变量分配数组对象并在 New 子句中提供初始元素值。可以在同一 New 子句中同时提供长度与值。' (0) through (2). Dim BA4() As Byte = New Byte() {0, 1, 2}' (0) through (2). Dim BA5() As Byte = New Byte(2) {0, 1, 2}' (0) through (2).Dim BA6() As Byte = {0, 1, 2}

Page 46: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

下列错误:' INVALID (New after length specified).Dim BA1(2) As Byte = New Byte

' INVALID (missing braces). Dim BA2() As Byte = New Byte

' INVALID (missing braces).Dim BA3() As Byte = New Byte(2)

Page 47: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

以类似方法可以初始化多维数组变量。如下面的示例声明将一个两维数组变量声明为 2 行 2 列的 Short 型数组 ,第一个参数表示行;第二个参数表示列。Dim S2X21(1, 1) As Short ' (0) through (1), (0) through (1). Dim S2X22(,) As Short = New Short(,) {} ' Empty array object. Dim S2X23(,) As Short = New Short(1, 1) {} ' Elements have default

value. Dim S2X24(,) As Short = New Short(,) {{5, 6}, {7, 8}} ' Four

elements.下面初始化多维数组错误:

Dim S2X25(1, 1) As Short = New Short(, ) 'INVALID (New after lengths).

Dim S2X26(,) As Short = New Short(, ) ' INVALID (missing braces). Dim S2X27(,) As Short = New Short(1, 1) ' INVALID (missing braces).

Page 48: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

当初始化一个交错数组变量时,只能指定顶级数组的维度长度。下面的示例声明说明了一个 Byte 元素数组中的一个数组的有效和无效语法:' Array of two arrays of Byte elements. Dim JB(1)() As Byte ' INVALID (can only specify top-level size). Dim JB(1)(1) As Byte' INVALID (New after lengths). Dim JB(1)() As Byte = New Byte()()' Empty arrays.Dim JB()() As Byte = {New Byte() {}, New Byte() {}}' Default values.Dim JB()() As Byte = {New Byte(1) {}, New Byte(1) {}}Dim JB()() As Byte = {New Byte() {5, 6}, New Byte() {7, 8}}

Page 49: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组举例

创建一个整数一维数组,初始化数组元素并将它们分别输出:Module Test

Sub Main()Dim arr(5) As IntegerDim i As IntegerFor i = 0 To arr.GetUpperBound(0)

arr(i) = i * iNext iFor i = 0 To arr.GetUpperBound(0)

Console.WriteLine("arr(" & i & ") = " & arr(i))Next i

End SubEnd Module

Page 50: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组举例

程序输出结果如下:

arr(0) = 0arr(1) = 1arr(2) = 4arr(3) = 9arr(4) = 16arr(5) = 25

Page 51: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

IsArray 函数返回一个 Boolean 值,指示变量是否指向数组。 如:

' Declare array variables.Dim MyArray(4), YourArray(3) As Integer Dim MyString As StringDim MyCheck As BooleanMyCheck = IsArray(MyArray) ' Returns True.MyCheck = IsArray(YourArray) ' Returns True.MyCheck = IsArray(MyString) ' Returns False.

Page 52: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组

LBound 函数返回数组的指示维度的最小可用下标。

由于数组下标从 0 开始,因此每一维度最小可用的下标总是为 0。

UBound 函数返回数组的指示维度的最大可用下标。 如:

Dim Highest, MyArray(10, 15, 20), AnyArray(6) as Integer

Highest = UBound(MyArray, 1) ' Returns 10.Highest = UBound(MyArray, 3) ' Returns 20.Highest = UBound(AnyArray) ' Returns 6.

Page 53: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 数组 Erase 语句

用来释放数组变量和解除分配用于它们的元素的内存。本示例使用 Erase 语句清除两个数组并释放其内存(分别保存有 1000 和

100 存储元素)。Dim Int3DArray(9, 9, 9), Int2DArray(9, 9) As Integer' ...Erase Int3DArray, Int2DArray

ReDim 语句在过程级用于重新分配数组变量的存储空间。ReDim 语句可包含 Preserve 关键字,如包含表示当仅更改最后一个维度的

大小时,保留现有数组中的数据。Dim IntArray(10, 10, 10) As Integer' ...ReDim Preserve IntArray(10, 10, 20)' ...ReDim Preserve IntArray(10, 10, 15)

Page 54: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 委托

委托

委托是一种引用类型,它引用类型的 Shared 方法或对象的实例方法。在其他语言中,与委托最接近的是函数指针,但函数指针只能引用Shared 函数,而委托可以引用 Shared 和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。

(举例:exam1)

Page 55: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的数据类型 - 泛型

如:

Public Class classHolder(Of t)Public Sub processNewItem(ByVal newItem As t)

Dim tempItem As t' Insert code that processes an item of data type t.

End SubEnd Class其中,t 是一个类型参数。在代码中的其他地方,可以通过为 t 提

供不同的数据类型来声明不同版本的 classHolder。如:

Public integerClass As New classHolder(Of Integer)Friend stringClass As New classHolder(Of String)上面的语句声明了构造类,在这些类中,特定的类型替换了类型

参数。此类替换会传播到构造类中的代码内。

Page 56: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句

语句表示可执行代码。 块 声明语句 With 语句 SyncLock 语句 事件语句 赋值语句 调用语句 条件语句 循环语句 异常处理语句 控制流语句 数组处理语句

Page 57: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 块

语句块由标记行组成。每个标记行都以可选的标签声明开始,后跟用冒号分隔的零个或多个语句。如:Swap: t=a : a=b: b=t

标签具有自己的声明空间,并不影响其他标识符。如下例将x 既用作参数,又用作标签。

Function F(x As Integer) As IntegerIf x >= 0 Then

GoTo xEnd Ifx = -x

x: Return x

End Function

Page 58: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 块

标签的范围是方法体。

因为标签和语句都用冒号分隔,所以标签声明可能看起来像语句;在所有多义性情况中,标签声明总是优先。 如:

dim a,t,b as integera=5:b=10goto a......a:t=a:a=b:b=tConsole.Writeline("{0},{1}",a,b)

输出:10,5标签可以是标识符,也可以是整数。

块的执行从块中的第一个语句开始。执行完语句后,按词法顺序执行下一个语句,除非语句将执行传到别处或发生异常。

Page 59: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

声明语句

声明语句命名和定义过程、变量、数组和常数。

Dim:修饰“规则变量”。

Const:修饰“常数变量”(类型成员常数)。

声明语法:[访问修饰符] Dim|Const 标识符 [As 类型名] = 常数表达式

如:Const MyVar As Integer = 459Public Const MyString As String = "HELP"

Page 60: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - With 语句

With 语句允许在不必多次指定一个表达式的情况下多次引用该表达式的成员。语法:

With 表达式[ 块 ]

End With如:With MyLabel

.Height = 2000

.Width = 2000

.Text = "This is MyLabel"End With

Page 61: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - SyncLock 语句

在执行一个语句块前获取此块的独占锁。 语法:

SyncLock 表达式[ 块 ]

End SyncLock其中:表达式:必选项。计算结果等于对象引用的表达式。

块:可选项。获取独占锁时要执行的语句块。

SyncLock 语句确保不会同时有多个线程执行该语句块。

SyncLock 的最常见作用是保护数据不被多个线程同时更新。

Page 62: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - SyncLock 语句

如:Class Cache

Private Shared Sub Add(ByVal x As Object)SyncLock GetType(Cache) ‘对Cache类上锁End SyncLock ’终止 SyncLock 过程

End Sub

Private Shared Sub Remove(ByVal x As Object)SyncLock GetType(Cache)End SyncLock

End SubEnd Class

Page 63: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - SyncLock 语句

再如:维护简单消息列表的类。Class simpleMessageList

Public messagesList() As String = New String(50) {}Public messagesLast As Integer = -1Private messagesLock As New ObjectPublic Sub addAnotherMessage(ByVal newMessage As String)

SyncLock messagesLockmessagesLast += 1messagesList(messagesLast) = newMessage

End SyncLockEnd Sub

End Class

Page 64: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 事件语句 声明用户定义的事件 ,用Event语句;声明了事件后,使用 RaiseEvent

语句引发事件。语法:

[特性] [访问修饰符] Event 事件名[(形参表)] [ Implements 接口]

RaiseEvent 事件名[(参数表)] 如:

Public Class EventSource' Declare an event.Public Event LogonCompleted(ByVal UserName As String)Sub CauseEvent()

' Raise an event on successful logon.RaiseEvent LogonCompleted("AustinSteele")

End SubEnd Class

Page 65: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

事件和事件处理程序

声明事件使用 Event 关键字在类、结构、模块和接口内部

声明事件,如:

Event AnEvent(ByVal EventNumber As Integer)

引发事件使用 RaiseEvent 语句引发事件,如:

RaiseEvent AnEvent(EventNumber)必须在声明事件的范围内引发事件。例如,派生类

不能引发从基类继承的事件。

Page 66: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

事件和事件处理程序

关联事件与事件处理程序(事件发生时调用的过程)WithEvents 语句和 Handles 子句常常是事件处理程序的最佳选

择 。 在即将进行事件处理的模块的声明部分,用 WithEvents 关

键字声明事件源(能引发事件的对象)的对象变量,如以下示例所示:Public WithEvents ClassInst As Class1

在代码编辑器中,从左边的“类名”下拉列表里选择刚声明的WithEvents 变量。

从右边的“方法名称”下拉列表选择要处理的事件。代码编辑器用一个 Handles 子句创建空事件处理程序过程。Handles 关键字用于声明处理指定的事件的过程。注意 此步骤为可选项。只要创建的过程是子例程,有与处理中的事

件匹配的正确参数列表,有指定正在处理的事件的 Handles 子句,就可以手动创建事件处理程序过程。

Page 67: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

事件和事件处理程序

使用提供的参数给事件处理程序过程添加事件处理代码。以下代码提供了一个示例:

Public Sub ClassInst_AnEvent(ByVal EventNumber As System.Integer) Handles ClassInst.AnEvent

MessageBox.Show("Received event number: " & CStr(EventNumber))

End Sub(举例:Exam1)

Visual Basic .NET 还提供了另一种处理事件的方法:AddHandler 语句。AddHandler 和 RemoveHandler 允许动态地启动和停止特定事件的事件处理。

Page 68: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

事件和事件处理程序

用 AddHandler 处理事件 声明类的对象变量,该变量是您要处理的事件源。不像

WithEvents 变量,此变量可以是过程中的本地变量;例如: Dim CI As New Class1()

用 AddHandler 语句指定事件发送器的名称,用 AddressOf 语句提供事件处理程序的名称;例如:AddHandler CI.AnEvent, AddressOf Ehandler

只要支持处理中的事件的正确参数,任何过程都能用作事件处理程序。

给事件处理程序添加代码,如以下示例中所示:Public Sub EHandler(ByVal EventNumber As Integer)

MessageBox.Show("Received event number " & CStr(EventNumber))

End Sub

Page 69: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

事件和事件处理程序

使用 RemoveHandler 停止处理事件

可以使用 RemoveHandler 语句动态地断开事件与事件处理程序过程之间的连接。

用 RemoveHandler 语句指定事件发送器的名称,用 AddressOf 语句提供事件处理程序的名称。RemoveHandler 语句的语法将与用于启动事件处理的 AddHandler 语句紧密匹配,例如:RemoveHandler CI.AnEvent, AddressOf Ehandler(举例)

Page 70: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 赋值语句

将表达式的值赋给变量。分:简单赋值语句、复合赋值语句、委托赋值语句和Mid 赋值语句。

Page 71: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 简单赋值语句

简单赋值语句在变量中存储表达式的结果。表达式的类型必须可以隐式转换为变量的类型。语法:

变量表达式 = 表达式语句如:

x = 42x = y + z + MyFunction(3)Dim x As Stringx = "String variable assignment"x = "Con" & "cat" & "enation" ' x equals "Concatenation".Dim x As Booleanx = Truex = 45 > 1003 ' x equals False.x = 45 > 1003 Or 45 > 17 ' x equals True.

MyTextBox.Text = "This " & "is a " & "String" ' MyTextBox.Text = "This is a String".

Page 72: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 复合赋值语句

如果赋值运算符是一个复合赋值运算符(一个二元运算符后跟一个等号),则 V OP= E 形式的赋值语句(其中 OP 是有效的二元运算符)转换为 V = V OP E。语法:

变量表达式 复合二元运算符= 表达式语句

复合二元运算符有:^,*,/,\,+,-,&如:x += 1

Dim x As String = "My “x &= "String" ' x equals "My String".

Page 73: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 委托赋值语句

如果赋值语句包含关键字 AddressOf,则赋值语句右侧的表达式必须为调用目标,并且变量的类型必须是同调用目标兼容的委托。D = E 形式的委托赋值语句转换为 D = New T(E),其中 T 是 D 的委托类型。语法:

变量表达式 = AddressOf 调用目标表达式

Page 74: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - Mid 赋值语句

Mid 赋值语句将一个字符串赋给另一个字符串。语法:Mid[$](变量表达式 , 表达式 [,表达式]) = 表达式

如:Dim MyString As StringMyString = "The dog jumps" ' Initializes string.Mid(MyString, 5, 3) = "fox" ' MyString = "The fox

jumps".Mid(MyString, 5) = "cow" ' MyString = "The cow

jumps".Mid(MyString, 5) = "cow jumped over" ' MyString =

"The cow jumpe".Mid(MyString, 5, 3) = "duck" ' MyString = "The duc

jumpe".

Page 75: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 调用语句

调用语句调用以可选的关键字 Call 开头的方法。调用语句的处理方法与函数调用表达式相同。 语法:

[ Call ] 调用表达式

如: ' Call a Sub procedure.Call PrintToDebugWindow("Hello World") ' The above statement passes control to the following Sub

procedure.Sub PrintToDebugWindow(ByVal AnyString As String)

Debug.WriteLine(AnyString) ' Print to the Output window.End Sub

' Call a Visual Basic run-time function (Shell), discard the return value.

Call Shell("C:\WINNT\system32\calc.exe", AppWinStyle.NormalFocus)

Page 76: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 条件语句

条件语句允许根据运行时计算的表达式有条件地执行语句。 If...Then...Else 语句

语法: If...Then If...Then...Else

如:Dim AlertLabel As New System.Windows.Forms.Label' ...Sub AlertUser(ByVal Value As Long)

If Value = 0 ThenAlertLabel.ForeColor = Color.Red

ElseAlertLabel.Forecolor = Color.BlackEnd If

End Sub

Page 77: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 条件语句

Select...Case 语句根据表达式的值,执行若干组语句中的某一组。Select [ Case ] 基本数据类型表达式

[ Case 表达式子句列表 [语句块] ][ Case Else [语句块] ]

End Select 其中,表达式子句列表表示基本数据类型表达式的匹配值。多个表

达式子句以逗号隔开。每个子句可以采取下面的某一种形式: 表达式1 To 表达式2 [ Is ] 比较操作符 表达式 表达式

Select Case 语句可以嵌套。每个嵌套的 Select Case 语句必须有相应的 End Select 语句。

如:

Page 78: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 条件语句

Select PerformanceCase 1 ' Performance is 1.

Return Salary * 0.1Case 2, 3 ' Performance is 2 or 3.

Return Salary * 0.09Case 5 To 7 ' Performance is 5, 6, or 7.

Return Salary * 0.07Case 4, 8 To 10 ' Performance is 4, 8, 9, or 10.

Return Salary * 0.05Case Is < 15 ' Performance is 11, 12, 13, or 14.

Return 100Case Else ' Performance is < 1 or > 14.

Return 0End Select

Page 79: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 循环语句

循环语句允许语句的重复执行。包括:While 语句、DoLoop 语句、For 语句、

ForEach 语句

Page 80: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - While 语句

语法: While 布尔表达式[ 块 ]

End While 如:Dim Counter As Integer = 0Dim Number As Integer = 10While Number > 6

Number = Number - 1Counter = Counter + 1

End WhileMsgBox("The loop ran " & Counter & " times.") ' Runs 4 times.

Page 81: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - Do...Loop 语句

当某个 Boolean 条件为 True 时或在该条件变为 True 之前,重复某个语句块。语法:Do [ While | Until ] 布尔表达式

[语句块][ Exit Do ][语句块]

Loop或Do

[语句块][ Exit Do ] [语句块]

Loop [ While | Until ] 布尔表达式如:

Page 82: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - Do...Loop 语句

Dim Check As Boolean = TrueDim Counter As Integer = 0Do ' Outer loop.

Do While Counter < 20 ' Inner loop.Counter += 1 ' Increment Counter.If Counter = 10 Then ' If condition is True,

Check = False ' Set value of flag to False.Exit Do ' Exit inner loop.

End IfLoop

Loop Until Check = False ' Exit outer loop ' immediately.

Page 83: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - For...Next 语句

将一组语句重复执行指定的次数。语法:

For 循环控制变量[ As 数据类型] = 表达式 To 表达式 [ Step 表达式 ] [语句块] [ Exit For ] [语句块]

Next [ Next 表达式列表 ] 如:

Page 84: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - For...Next 语句

例:创建字符串,字符串包含十个从 0 到 9 的数字,字符串之间用一个空格隔开。Dim Words, Digit As IntegerDim MyString As StringFor Words = 10 To 1 Step -1 ' Set up 10 repetitions.

For Digit = 0 To 9 ' Set up 10 repetitions.' Append number to string.MyString = MyString & CStr(Digit)

Next Digit ' Increment counter.MyString = MyString & " " ' Append a space.

Next Words

Page 85: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - For Each...Next 语句

对于集合中的每个元素重复一组语句。语法:

For Each 循环控制变量[ As 数据类型] In 表达式语句

[语句块] [ Exit For ] [语句块]

Next [变量表达式] 如:

Page 86: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - For Each...Next 语句

例:查找“Hello”字符串

Dim Found As Boolean = FalseDim MyCollection As New Collection' Iterate through elements.For Each MyObject As Object In MyCollection

' If Text equals "Hello" If CStr(MyObject.Text) = "Hello" Then

Found = True ' Set Found to True.Exit For ' Exit loop.

End IfNext

Page 87: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 异常处理语句

Visual Basic .NET 支持结构化异常处理和非结构化异常处理。一个方法中只能使用一种风格的异常处理,但结构化异常处理和非结构化异常处理都可以使用 Error 语句。如果方法同时使用两种风格的异常处理,则将发生编译时错误。

Page 88: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 -结构化异常处理语句

程序通过执行 Throw 语句指示异常条件已经发生。

结构化异常处理通过 Try 语句完成。可以在 Try语句中捕获 Throw 语句所引发的异常。

如:

Page 89: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 -结构化异常处理语句

Module TestSub F()

TryG()

Catch e As ExceptionConsole.WriteLine("Exception in F: " & e.Message)e = New Exception("F")' Re-throw here.Throw e

End TryEnd SubSub G()

Throw New Exception("G")End Sub

Page 90: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 -结构化异常处理语句

Sub Main()Try

F()Catch e As Exception

Console.WriteLine("Exception in Main: " & e.Message)End Try

End SubEnd Module原始异常被重新引发,因此程序的输出如下:Exception in F: GException in Main: F

Page 91: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 -非结构化异常处理语句

非结构化异常处理由三个语句实现:Error 语句、On Error 语句和 Resume 语句。 如:

Sub TestSubOn Error GoTo ErrorHandler

' Code that may or may not contain errors.ERROR 11 ' Simulate the "Division by zero"

Exit Sub

ErrorHandler:' Code that handles errors.Resume

End Sub

Page 92: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 控制流语句

控制流语句修改程序的执行流。有五种控制流语句:

GoTo 语句:将执行传给方法中的指定标签。

Exit 语句:将执行传给指定类型的、直接包含块语句末尾的下一个语句。如果块为方法块,执行传回调用方法的表达式。

Stop 语句:导致发生调试异常。

End 语句:导致程序终止。

Return 语句:将执行返回调用方法的表达式。如果方法是一个子例程,该语句等效于 Exit Sub 语句但不能提供任何表达式。如果方法是一个函数,则必须提供可以隐式转换为函数返回类型的表达式;这种形式等效于给函数的返回局部变量赋值,然后执行 ExitFunction 语句。

Page 93: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 数组处理语句

两种语句简化了数组的处理:ReDim 语句和Erase 语句。

ReDim 语句实例化新数组。在过程级用于重新分配数组变量的存储空间。

ReDim语句用来更改已被正式声明的数组的一个或多个维度的大小。但无法更改该数组的秩(维度数目)。

ReDim语句无法更改数组变量的数据类型,或无法提供数组元素的新初始化值。

ReDim 释放现有数组并且创建具有相同秩的新数组。除非指定 Preserve,否则新数组的元素初始化成它们的数据类型的默认值。

Page 94: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 数组处理语句

下例用 ReDim 语句分配和重新分配数组变量的存储空间。Dim I, MyArray() As Integer ‘声明变量和数组变量ReDim MyArray(5) ' Allocate 6 elements. For I = 0 To UBound(MyArray)

MyArray(I) = I ' Initialize array. Next I '下一个语句重新调整该数组的大小,而不保存该元素的内容。ReDim MyArray(10) ' Resize to 11 elements. For I = 0 To UBound(MyArray)

MyArray(I) = I ' Initialize array. Next I '下面的语句重新调该整数组的大小,且保存该元素的内容。ReDim Preserve MyArray(15) ' Resize to 16 elements.

Page 95: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的语句 - 数组处理语句

Erase 语句用来释放数组变量和解除分配用于它们的元素的内存。

如:使用 Erase 语句清除两个数组并释放其内存(分别保存有 1000 和 100 存储元素)。然后,ReDim 语句将新的数组实例赋给其中的三维数组。

Dim Int3DArray(9, 9, 9), Int2DArray(9, 9) As Integer

' ...Erase Int3DArray, Int2DArray' ...ReDim Int3DArray(4, 4, 9)

Page 96: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的其他特性 – 特性

VB.NET程序可以包含特性Imports System<AttributeUsage(AttributeTargets.All)> _Public Class HelpAttribute

Inherits Attribute Public Sub New(urlValue As String)

Me.urlValue = urlValueEnd SubPublic Topic As String = NothingPrivate urlValue As StringPublic ReadOnly Property Url() As String

GetReturn urlValue

End GetEnd Property

End Class

Page 97: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的其他特性 -特性

下面的示例显示了特性的若干用法:

<Help("http://202.38.64.11/~shizhu/Dotnet.htm")> _

Public Class Class1 <Help("http://202.38.64.11/~shizhu/Dotnet.htm", Topic := "F")> _Public Sub F()End Sub

End Class

Page 98: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

VB.NET的其他特性 -特性

下例程序片段查Class1是否具有 Help特性;如有,则写出关联的 Topic 和 Url 值。

Dim type As Type = GetType(Class1)Dim arr As Object() =type.GetCustomAttributes(GetType(HelpAttribute), true)

If arr.Length = 0 ThenConsole.WriteLine("Class1 has no Help attribute.")

ElseDim ha As HelpAttribute = CType(arr(0), HelpAttribute)Console.WriteLine("Url = " & ha.Url & "Topic = " & ha.Topic)

End If

Page 99: Visual Basic - staff.ustc.edu.cnstaff.ustc.edu.cn/~shizhu/DotNet/vb.pdf · 编译和执行 可以使用Visual Studio .NET 集成开发 ... 编译并运行程序 创建一个Visual

举例 数字钟

在窗体上显示当前时间

模拟秒表窗体上有一个显示屏:显示0.00,三个按键:”开始”、”暂停”、“结

束”。初始时,“暂停”、 “结束”键不可用。要求: 当按下“开始”时,开始计时,显示屏显示计时信息, “暂停”、 “结

束”键可用, “开始”键不可用; 按下“暂停”键时,显示屏计时信息暂停显示,但计时仍继续,“暂停”

键变成“继续”键; 按下“继续”键时,显示屏恢复显示按“开始”键以来的计时信息,

“继续” 键变成“暂停”键; 按下“结束”键,计时停止, “结束”键变成“归零”键, “继续”或

“暂停”键不可用。 单击“归零”键,回到初始状态

做一个“闹钟”类,要求可在指定时间或在指定时间段产生“时间到”事件