Visual Basic 中的语句是一个完整的指令。 它可以包含关键字、运算符、变量、常量和表达式。 每个语句属于以下类别之一:
声明语句,用于命名变量、常量或过程,还可以指定数据类型。
可执行语句,用于启动操作。 这些语句可以调用方法或函数,并且可以在代码块中进行循环或分支操作。 可执行语句包括 赋值语句,用于向变量或常量赋值或表达式。
本主题介绍每个类别。 此外,本主题介绍如何在单个行上合并多个语句,以及如何在多行上继续语句。
声明语句
使用声明语句来命名和定义过程、变量、属性、数组和常量。 声明编程元素时,还可以定义其数据类型、访问级别和范围。 有关详细信息,请参阅 声明的元素特征。
以下示例包含三个声明。
Public Sub ApplyFormat()
Const limit As Integer = 33
Dim thisWidget As New widget
' Insert code to implement the procedure.
End Sub
第一个声明是 Sub
语句。 它与匹配的 End Sub
语句一起声明一个名为 applyFormat
的过程。 它还指定,applyFormat
是 Public
,这意味着任何可以引用它的代码都可以调用它。
第二个声明是 Const
声明常量 limit
、指定 Integer
数据类型和值 33 的语句。
第三个声明是 Dim
声明变量 thisWidget
的语句。 数据类型是一个特定对象,即从 Widget
类创建的对象。 可以将变量声明为任何基本数据类型或正在使用的应用程序中公开的任何对象类型。
初始值
当包含声明语句的代码运行时,Visual Basic 会保留声明元素所需的内存。 如果元素包含值,Visual Basic 会将它初始化为其数据类型的默认值。 有关详细信息,请参阅 Dim 语句中的“行为”。
可以将初始值赋给变量作为其声明的一部分,如以下示例所示。
Dim m As Integer = 45
' The preceding declaration creates m and assigns the value 45 to it.
如果变量是对象变量,则可以在使用 New Operator 关键字声明该变量时显式创建其类的实例,如以下示例所示。
Dim f As New FileInfo("filename")
请注意,在执行到达其声明语句之前,不会将你在声明语句中指定的初始值分配给变量。 在该时间之前,变量包含其数据类型的默认值。
可执行语句
可执行语句执行一个动作。 它可以调用过程、分支到代码中的另一个位置、循环访问多个语句或计算表达式。 赋值语句是可执行语句的特殊情况。
以下示例使用 If...Then...Else
控件结构基于变量的值运行不同的代码块。 在每个代码块中,循环 For...Next
运行指定的次数。
Public Sub StartWidget(ByVal aWidget As widget,
ByVal clockwise As Boolean, ByVal revolutions As Integer)
Dim counter As Integer
If clockwise = True Then
For counter = 1 To revolutions
aWidget.SpinClockwise()
Next counter
Else
For counter = 1 To revolutions
aWidget.SpinCounterClockwise()
Next counter
End If
End Sub
If
前面的示例中的语句检查参数clockwise
的值。 如果值为 True
,则调用spinClockwise
的aWidget
方法。 如果值为 False
,则调用spinCounterClockwise
的aWidget
方法。 控制结构 If...Then...Else
结束于 End If
.
在For...Next
块中的循环调用相应方法的次数等于revolutions
参数的值。
赋值语句
赋值语句执行赋值运算,包括获取赋值运算符(=
)右侧的值并将其存储在左侧的元素中,如以下示例所示。
v = 42
在前面的示例中,赋值语句将文本值 42 存储在变量 v
中。
符合条件的编程元素
赋值运算符左侧的编程元素必须能够接受和存储值。 这意味着它必须是非 ReadOnly 的变量或属性,或者必须是数组元素。 在赋值语句的上下文中,此类元素有时称为 lvalue(表示“左值”)。
赋值运算符右侧的值由表达式生成,该表达式可以包含文本、常量、变量、属性、数组元素、其他表达式或函数调用的任意组合。 下面的示例对此进行了演示。
x = y + z + FindResult(3)
前面的示例将变量 y
中保留的值添加到变量中 z
保存的值,然后添加调用函数 findResult
返回的值。 然后,此表达式的总值存储在变量 x
中。
赋值语句中的数据类型
除数值外,赋值运算符还可以赋 String
值,如以下示例所示。
Dim a, b As String
a = "String variable assignment"
b = "Con" & "cat" & "enation"
' The preceding statement assigns the value "Concatenation" to b.
还可以使用Boolean
文本或Boolean
表达式分配Boolean
值,如以下示例所示。
Dim r, s, t As Boolean
r = True
s = 45 > 1003
t = 45 > 1003 Or 45 > 17
' The preceding statements assign False to s and True to t.
同样,你可以为Char
、Date
或Object
数据类型的编程元素分配适当的值。 还可将某个对象实例赋给声明为从中创建了该实例的类的元素。
复合赋值语句
复合赋值语句 先对表达式执行作,然后再将其分配给编程元素。 下面的示例演示了其中一个运算符, +=
该运算符将运算符左侧的变量的值递增为右侧表达式的值。
n += 1
前面的示例将 1 添加到值 n
中,然后将该新值 n
存储在其中。 它是以下语句的简写等效项:
n = n + 1
可以使用此类型的运算符执行各种复合赋值作。 有关这些运算符的列表及其详细信息,请参阅 赋值运算符。
串联赋值运算符 (&=
) 可用于将字符串添加到现有字符串的末尾,如以下示例所示。
Dim q As String = "Sample "
q &= "String"
' q now contains "Sample String".
赋值语句中的类型转换
分配给变量、属性或数组元素的值必须是适合该目标元素的数据类型。 通常,应尝试生成与目标元素相同的数据类型的值。 但是,某些类型可以在分配期间转换为其他类型的类型。
有关在数据类型之间进行转换的信息,请参阅 Visual Basic 中的类型转换。 简言之,Visual Basic 会自动将给定类型的值转换为它扩大到的任何其他类型。 扩大转换是在运行时始终成功且不会丢失任何数据的一种转换。 例如,Visual Basic 在适当时会将Integer
值转换为Double
,因为Integer
值会扩展为Double
。 有关详细信息,请参阅 “扩大和缩小转换”。
缩小转换 (那些未扩大的转换)会导致运行时发生故障或数据丢失的风险。 可以使用类型转换函数显式执行缩小转换,也可以指示编译器通过设置 Option Strict Off
隐式执行所有转换。 有关详细信息,请参阅 隐式和显式转换。
将多个语句放在一行上
可以在用冒号 (:
) 字符分隔的单个行上有多个语句。 下面的示例对此进行了演示。
Dim sampleString As String = "Hello World" : MsgBox(sampleString)
虽然有时很方便,但这种形式的语法会使代码难以读取和维护。 因此,建议将一条语句保留在一行中。
在多行中续写一条语句
通常适合在一行中编写一条语句,但如果该语句太长,可以使用续行序列将其延续到下一行,该序列包括一个空格,后接下划线字符 (_
),再后接回车符。 在以下示例中,MsgBox
可执行语句跨越两行。
Public Sub DemoBox()
Dim nameVar As String
nameVar = "John"
MsgBox("Hello " & nameVar _
& ". How are you?")
End Sub
隐式续行
在许多情况下,可以在下一个连续行上继续一条语句,而无需使用下划线字符(_
)。 以下语法元素隐式继续下一行代码中的语句。
在逗号 (
,
) 后面。 例如:Public Function GetUsername(ByVal username As String, ByVal delimiter As Char, ByVal position As Integer) As String Return username.Split(delimiter)(position) End Function
在左括号(
(
)之后或在右括号()
)前。 例如:Dim username = GetUsername( Security.Principal.WindowsIdentity.GetCurrent().Name, CChar("\"), 1 )
在左大括号 (
{
) 后面或右大括号 (}
) 前面。 例如:Dim customer = New Customer With { .Name = "Terry Adams", .Company = "Adventure Works", .Email = "terry@www.adventure-works.com" }
有关详细信息,请参阅 对象初始值设定项:命名和匿名类型 或 集合初始值设定项。
在 XML 文本中的左嵌入式表达式 (
<%=
) 后面或右嵌入式表达式 (%>
) 前面。 例如:Dim customerXml = <Customer> <Name> <%= customer.Name %> </Name> <Email> <%= customer.Email %> </Email> </Customer>
有关详细信息,请参阅 XML 中的嵌入表达式。
在串联运算符 (
&
) 后面。 例如:cmd.CommandText = "SELECT * FROM Titles JOIN Publishers " & "ON Publishers.PubId = Titles.PubID " & "WHERE Publishers.State = 'CA'"
有关详细信息,请参阅 按功能列出的运算符。
在赋值运算符(
=
、&=
、:=
、+=
、-=
、*=
、/=
、\=
、^=
、<<=
、>>=
)后面。 例如:Dim fileStream = My.Computer.FileSystem. OpenTextFileReader(filePath)
有关详细信息,请参阅 按功能列出的运算符。
表达式中的二元运算符(
+
,-
,/
,*
,Mod
,<>
,<
,>
,<=
,>=
,^
,>>
,<<
,And
,AndAlso
,Or
,OrElse
,Like
,Xor
)之后。 例如:Dim memoryInUse = My.Computer.Info.TotalPhysicalMemory + My.Computer.Info.TotalVirtualMemory - My.Computer.Info.AvailablePhysicalMemory - My.Computer.Info.AvailableVirtualMemory
有关详细信息,请参阅 按功能列出的运算符。
在
Is
和IsNot
运算符后面。 例如:If TypeOf inStream Is IO.FileStream AndAlso inStream IsNot Nothing Then ReadFile(inStream) End If
有关详细信息,请参阅 按功能列出的运算符。
在成员限定符 (
.
) 后面和成员名称前面。 例如:Dim fileStream = My.Computer.FileSystem. OpenTextFileReader(filePath)
但是,当使用
_
语句或在类型初始化列表中提供值时,必须在成员限定符字符之后包含一个行继续符(With
)。 在使用=
语句或对象初始化列表时,请考虑在赋值运算符(例如With
)之后中断该行。 例如:' Not allowed: ' Dim aType = New With { . ' PropertyName = "Value" ' Allowed: Dim aType = New With {.PropertyName = "Value"} Dim log As New EventLog() ' Not allowed: ' With log ' . ' Source = "Application" ' End With ' Allowed: With log .Source = "Application" End With
有关详细信息,请参阅 With...End With 语句或对象初始值设定项:命名类型和匿名类型。
在 XML 轴属性限定符(
.
、.@
或...
)后面。 但是,您在使用_
关键字时指定成员限定符时,必须包含行延续字符(With
)。 例如:Dim customerName = customerXml. <Name>.Value Dim customerEmail = customerXml... <Email>.Value
有关详细信息,请参阅 XML 轴属性。
指定属性时在小于号 (<) 后面或大于号 (
>
) 前面续行。 也可以在指定属性时在大于号 (>
) 后面续行。 但是,在指定程序集级别或模块级属性时,必须包含行延续字符(_
)。 例如:< Serializable() > Public Class Customer Public Property Name As String Public Property Company As String Public Property Email As String End Class
有关详细信息,请参阅 属性概述。
查询运算符(
Aggregate
、Distinct
、From
、Group By
、Group Join
、Join
、Let
、Order By
、Select
、Skip
、Skip While
、Take
、Take While
、Where
、In
、Into
、On
、Ascending
和Descending
)前后。 不能在由多个关键字(Order By
、Group Join
、Take While
和Skip While
)组成的查询运算符的关键字之间断行。 例如:Dim vsProcesses = From proc In Process.GetProcesses Where proc.MainWindowTitle.Contains("Visual Studio") Select proc.ProcessName, proc.Id, proc.MainWindowTitle
有关详细信息,请参阅 查询。
在
In
语句中的For Each
关键字后面。 例如:For Each p In vsProcesses Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}", p.ProcessName, p.Id, p.MainWindowTitle) Next
有关详细信息,请参阅 For Each...Next 语句。
在集合初始值设定项中的
From
关键字后面。 例如:Dim days = New List(Of String) From { "Mo", "Tu", "We", "Th", "F", "Sa", "Su" }
有关详细信息,请参阅 集合初始值设定项。
添加注释
源代码并不总是自我解释的,即使是编写它的程序员。 因此,为了帮助记录代码,大多数程序员都会自由使用嵌入式注释。 代码中的注释可以向阅读或处理该过程的任何人解释过程或特定指令。 Visual Basic 在编译过程中忽略注释,它们不会影响已编译的代码。
注释行以撇号('
)或REM
开头,之后跟一个空格。 可以在代码中的任意位置添加它们,但字符串中除外。 若要向语句追加注释,请插入撇号或 REM
语句后面,后跟注释。 也可以独行添加注释。 以下示例演示了这些可能性。
' This is a comment on a separate code line.
REM This is another comment on a separate code line.
x += a(i) * b(i) ' Add this amount to total.
MsgBox(statusMessage) REM Inform operator of status.
检查编译错误
如果键入代码行后,该行将显示带有波浪蓝色下划线(可能也显示错误消息),则语句中有语法错误。 你必须找出语句出错的原因(可以查看任务列表,或将鼠标指针悬停在错误上并阅读错误消息),然后更正错误。 在修复代码中的所有语法错误之前,程序将无法正确编译。
相关章节
术语 | 定义 |
---|---|
赋值运算符 | 提供语言参考页的链接,这些页面涵盖赋值运算符,例如 = , *= 和 &= 。 |
运算符和表达式 | 演示如何将元素与运算符结合,从而生成新值。 |
如何:在代码中中断和合并语句 | 演示如何将单个语句分解为多个行,以及如何在同一行上放置多个语句。 |
如何标记语句 | 演示如何标记代码行。 |