Visual Basic .NET
✍ dations ◷ 2025-09-11 10:33:50 #Visual Basic .NET
Visual Basic .NET(VB.NET)是.NET框架和后来的.NET下的一种多重编程范式高级语言。
VB.NET,是微软公司于2002年作为原有的Visual Basic的继承者而推出。虽然自2005年起,语言名称中的“.NET”就已经被去掉了。但为了与VB 6.0及以前版本的Visual Basic进行区分,“Visual Basic .NET”的名字仍然被社会公众用来指代VB 7.0及以后的Visual Basic。VB.NET与C#同为.Net Framework框架下两种主要的程序设计语言,都是为了调用.Net Framework的类库资源,因此两种语言具有很高的对应性,数据类型、控制结构与语言特性都存在一一对应,容易把源代码从一种语言对译为另一种语言。
微软公司的集成开发环境Visual Studio是最为广泛使用的VB.NET开发工具。然而Visual Studio的大部分版本都是价格不菲的商业软件,除了Express版本和Visual Studio Community(以上两者皆为免费软件)。除了Visual Studio,SharpDevelop和Mono也是可用的VB.NET开发环境。
VB.Net的数据类型,实际上是.Net Framework定义的数据类型。
此外,还有SByte、UShort、UInteger、ULong等无符号数据类型。
&O123表示八进制;&H123表示十六进制。
VB使用的名字是大小写不敏感的。但是,CLR是大小写敏感的。所以建议保持一致的大小写。
VB自版本5以后的数据类型来源于COM,而其根源是OLE数据类型。
在与空值做比较时,需要区分各种不同用法:
对于可空类型,实际上是Nullable(Of T)泛型结构。例如,下述三行等价:
Dim ridesBusToWork1? As BooleanDim ridesBusToWork2 As Boolean?Dim ridesBusToWork3 As Nullable(Of Boolean)
比较表达式someVar = Nothing的结果永远是Nothing,应该用someVar.HasValue()方法去判断是否为空,或者用Is或IsNot关键字。
Dim arr() As dataType = new dataType() {} '声明数组arr(index) = value '使用数组
数组的下标开始自0,这遵从了.NET的标准。如果不指定数组的下标上界,则为动态数组,其长度可以动态调整。
If 条件 Then 语句ElseIf 条件 Then 语句Else 语句End If
Select Case Variable Case Value1 Statements Case Value2 Statements Case Value3 Statements ... Case Else StatementsEnd Select
循环语句
包括下述几种:
For varName = 初值 To 终值 循环体语句Next varName
或
Do statements statementsLoop
While condition statements statemenstEnd While
For Each element in group statementsNext
Yield语句
实现迭代器遍历一个序列,每次获取一个返回值。迭代器可以作为一个方法或属性的get访问器,其中的Yield 语句返回迭代器的返回值,并记住当前执行的位置。下次再调用迭代器,从该执行位置恢复执行,直至迭代器代码执行完或者遇到Exit Function或Return语句。编译器把迭代器作为一个状态机的类。
Sub Main() Dim days As New DaysOfTheWeek() For Each day As String In days Console.Write(day & " ") Next ' Output: Sun Mon Tue Wed Thu Fri Sat Console.ReadKey()End Sub Private Class DaysOfTheWeek Implements IEnumerable Public days = New String() {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"} Public Iterator Function GetEnumerator() As IEnumerator _ Implements IEnumerable.GetEnumerator ' Yield each day of the week. For i As Integer = 0 To days.Length - 1 Yield days(i) Next End Function End Class
面向对象
面向对象时,类的声明示例:
Public Class className Public varName As Integer '資料成員 Public Property propertyName() As Integer '屬性 Public Get Return m_var End Get Public Set(ByVal value As Integer) m_var=value End Set End Property Public Sub subName(ByVal param1 As Integer) '方法 End Sub Public Function funcName(ByVal param2 As Integer ) As Integer '函數 Return 101 End Function Event eventName() '事件 Public Sub new() '類的構造子(constructor),可以有多個(即可以重載) End SubEnd Class
上述示例中的Public关键字表示可访问性(accessibility),表示可以被任意代码访问;它可以替换为其他的可访问性:Private(仅限该Class自身访问)、Friend(仅限同一项目中的代码访问)、Protected(仅限自身或派生类访问)、Protected Friend等。如果使用ReadOnly,则表示资料成员或属性是只读;WriteOnly表示只写。Shadows关键字表示覆盖父类中同名(但不一定参数相同)的Event。使用关键字MyBase引用基类。
类可用继承修饰符:NotInheritable关键字,表示该类不能做基类;MustInherit关键字,表示这是一个抽象类。
类的属性与方法能否被覆盖:Overridable关键字表示可被覆盖;Overrides关键字表示覆盖了基类中同名的方法或属性;NotOverridable关键字表示不可覆盖;MustOverride表示方法或属性仅声明没有实现,这时该类必须有MustInherit修饰符,是一个抽象类或者接口,仅能包含属性、方法、函数的声明。
如同其他.Net语,Visual Basic不允许多重继承,但可以同时实现多个interface。
接口是一类特殊的抽象类,不能包括可执行代码与类的资料成员的声明:
Interface interfaceName Event eventName() Property propertyName As typeName Function funcName() As returnTypeName End Interface
接口中这些成员都强制是Public可访问性。
实现一个接口,使用Implements关键字:
Public Function GetEnumerator() As IEnumerator _ Implements IEnumerable.GetEnumerator
多态(Polymetric)
基于继承的多态,是指用基类类型的变量绑定不同的子类对象,这样调用基类变量的方法,在执行时动态确定实际执行了哪个派生类的同名的方法。多态的优点是可以针对基类(或接口)的方法来写一个通用的过程或者资料容器,适用于各种不同的派生类的具体实现。
委托本质上是一种Class,派生自System.Delegate,包含了三部分资料:一个类对象的地址、该对象所属类的一个方法的地址,以及另一个委托的引用(reference)。前两部分可以实现对一个类对象的方法的调用;第三部分把委托形成一个链表,使其依次被调用执行。如下声明了一个委托:
Delegate Sub PlayHandler(ByVal sender As Object, ByVal e As System.EventArgs)
委托常用于事件处理(Event Handler)。.Net Framework的事件是类的属性(实际上是一个嵌套类),用于封装参数格式固定的委托;该委托的参数总是为(ByVal sender As Object, ByVal e as System.EventArgs),返回值为void(即Sub类型)。例如:
Public Class clsName Public Event monitor As PlayHandler End Class
对一个具体的实例,可以给它的事件在运行时动态追加上一个或多个事件处理函数:
AddHandlerins.monitor, AddressOf playHandle_1
AddHandle指向引发事件的对象;AddressOf把一个函数或过程名转化为一个隐式创建的委托实例,用于确定该事件对象所要调用的事件进程。在AddressOf关键字可隐式创建一个引用特定过程的委托的实例。
程序可以抛出一个事件:
Dim WithEvents e As New System.EventArgs Dim ins As New clsName RaiseEvent ins.monitor(ins,e)
using语句
using语句,定义一个范围,在范围结束时自动释放对象所占用的资源。
Using conn As New SqlConnection'当在某个代码段中使用了类的实例,而希望无论因为什么原因,只要离开了这个代码段就自动调用这个类实例的Dispose。 '执行代码End Using
自动属性
例如:
Public Property pa As String=""
对象初始化器
集合(Collection)对象的初始化与普通类对象的属性初始化,分别使用From与With关键字。例如:
Public Class Person Public Property age As Integer Public Property Name As String End Class Dim personList As New List(Of Person) From { New Person With {.Name = "Qiang", .age = 24}, New Person With {.Name = "Wei", .age = 42} }
匿名类型
例如:
Dim people = New With {.name="kyo", .age=22}
匿名函数或lambda表达式
即无名的函数或过程,作为表达式的值。可以写为一行或多行。例如:
Dim func1=Function(i As integer) i+10Dim action = sub() End SubDim func2 = Function() End Function
可以在声明匿名函数的同时调用它。单行的lambda表达式不能使用Return关键字,其返回类型是自动推导得出;其参数要么都是用As关键字指明类型,要么全部是自动推导出类型。
lambda表达式在定义时可以使用所在上下文(context,即C++语言的闭包closure)的局部变量、参数、属性、Me等等的值,即使lambda表达式离开了定义时所在的context,这些被使用的局部变量等的值仍然有效。这是因为lambda表达式在定义时把所用到的context的值保存到它自己的定义类中。lambda表达式可以嵌套定义。
例如:
Imports System.Runtime.CompilerServices<Extension()> Public Function funcName(ByVal ins As className) As String 'Do somethingEnd Function
异常处理
Try ' write the condition hereCatch ex As Exception When condition ' Handle Exception when a specific condition is trueCatch ex As Exception ' Handle ExceptionFinally ' Cleanup, close connections etc ' NB this code is always executed regardless of if an Exception was raised or not!End Try
LINQ
From element In collection In collection2 ]
例子(Hello World)
这里给出了一个Hello World的例子。通过它们您可以更好地理解Visual Basic的特性。(此源代码运行于命令行下)
Module Mdl_Main Sub Main() Console.WriteLine("Hello World") End SubEnd Module
这个程序能输出。
Module Mdl_Main
第一行是模块定义,名字空间的定义一般可以省略。VB.NET中,所有函数,过程与变量的声明都必须在模块或者类的内部,而不能直接存在于名字空间内部。
Sub Main()
第二行定义了名为Main的过程。一般来说,“Sub Main()”是程序的入口点。
Console.WriteLine("Hello World")
第三行输出“Hello World”。
End Sub
第四行结束了过程Main的定义。
End Module
第五行结束了模块Mdl_Main的定义。
与旧版VB(VB 6.0及以前)相比较,VB.NET明显受到了.Net Framework中其他语言思想的影响。与旧版VB相比,VB.NET更加严格而不失灵活。
Visual Basic 6:(注意此过程的名称不可改变)
Private Sub Button1_Click() 'Work to doEnd Sub
VB.NET:(注意此过程的名称无关紧要)
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 'Work to doEnd Sub
- 很多原有的实现特殊功能的语句被相应定义好的函数替代。这减少了关键字的使用(如
Open()
函数取代Open
语句,窗体的Print()
方法取代Print
语句)。同时,被封装好的、功能更强大的、通用于.Net Framework框架的类被推荐用来取代原有的语句。 - 对一些更强大的语法特性的支持,如:LINQ,Lambda表达式(Visual Basic 2010起支持多行Lambda)。
- 同样使用
:
作为一行中分行的符号,_
作为续行符。但是VB.NET自Visual Basic 2012起允许在函数的定义与调用中不加_
地用换行分隔各个参数。
与C#等C家族语言比较
与C家族语言相比,VB.NET则较多保留了VB的特征,比如:
下面这两份功能一致的代码展现出了VB.NET与C#的很多不同之处:
Namespace N 'Comment Module M Public Function GetSum(arr() As Integer) As Integer Dim Sum = 0 'Auto Type Infer Dim i As Integer For Each i In arr Sum += i Next Return Sum End Function End Module Class C Private v As Integer Public Function F() As Integer Return v * v End Function Public Sub S(value As Integer) Me.v = value End Sub Public Sub New() 'Constructor Me.v = 0 End Sub End ClassEnd Namespace
namespace N{ //Comment static class M { int GetSum(int arr) { var Sum = 0; int i; foreach(i in arr) { Sum += i; } return Sum; } }; class C { private: int v; public: int F() { return v * v; } void S(int value) { this.v = value; } C() //Constructor { this.v = 0; } };}
VB.NET与C#同为.Net Framework的两大主力程序设计语言,尽管有着各种各样的不同,两者最终都编译为MSIL并由CLR运行。两者功能基本一致,并可以在.Net Framework框架下方便地互相调用与协同开发。关于两者的优劣一直见仁见智。
C语言编写的DLL文件,VB在调用时,需要注意:对于C语言的数组指针,在VB中调用时应将数组的首元素传递给DLL。不能直接传递数组名,因为如果传递数组名,VB实际会传一个复杂的结构类型给DLL。C函数无法确定数组大小,通常用另一个参数指出数组的大小。
<DllImport("D:GenericMESDLL.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)>Public Sub test(ByVal param As Integer, ByRef OK As Integer)End Sub'下述方法只能使用_stdcall调用约定:Public Declare Function test1 Lib "D:PackingDLL.dll" Alias "_test@4" (ByVal param As Integer) As Integer
历史
2002年Visual Basic .NET(VB 7.0)
Visual Basic .NET(VB 7.0)是随Visual C#和ASP.NET一起在2002年发布的最初始的VB.NET版本。C#被大力宣传为微软对付JAVA的王牌,受到媒体极力关注。然而VB.NET(有时被称为VB 7.0)影响面不广,这导致VB社区之外很少人关注它。那些试用过此版VB.NET的人在层层幕布下发现一个强大却艰深的语言,而且还有不少缺点,例如它的运行阶段组件(Run-Time)比VB6大了十倍,存储器使用量也大大增加。
VB 7.0引起了广泛的争议,主要原因在于对旧版VB的改动过大。许多资深的VB程序员抱怨VB.NET,因为VB.NET 2002丢掉了许多不再发行的VB6中使用的大量语言结构和用户界面功能,并且对保留下来的东西也改变了语意。例如,在VB.NET参数默认是以值方式传递的,而不是以引用方式。VB.NET 2002被半嘲讽半认真地称为Visual Fred或VB DOTNOT。作为对2005年3月8日微软拒绝为VB6再提供维护与支持的回应,当月月底出现了反对者的请愿。
VB.NET的支持者们认为新语言在很多方面比旧版本更为强大,比如它以相比早期版本更为自然、紧密和完全的方式地加入了现代面向对象的编程范式。反对者们有不同意见,虽然VB6对对象模型支持有缺点,但是二次开发升级到VB.NET的成本比升级后的收益要高得多。而开发软件发布因特网版本的独立程序员也对VB.NET的RunTime尺寸过大不满。
针对开发者的不满,微软主要做了如下努力:使新的开发更容易启动,而把已经开发的VB6代码升级到VB.NET。例子主要包括:完成VB6中的常见任务如打印预览;集成VB6和VB.NET解决方案(dubbed VB Fusion),从VB6代码转换到VB.NET。
微软在后续版本中撤销了一些过激的更改,并且吸取了经验。在以后版本中,语法的更改变得更加谨慎。
Visual Basic .NET 2003(VB 7.0)和.NET Framework 1.1一起发布。新功能包括对.NET Compact Framework的支持和更好的VB升迁向导。并改进了运行状况,IDE稳定性(尤其是后台编译器),以及运行时RunTime稳定性。另外,VB.NET 2003还有一个学院版Visual Studio .NET 2003 Academic Edition(VS03AE),它是分发给各国某些学者免费使用的版本。
Visual Basic 2005(VB 8.0)是VB.Net的重大转变,微软决意在其软件名称中去掉了.NET部分。在VB2005中,微软增加了许多新功能,以引用VB对于初学者来说的一些优点:
主要的变动:
Visual Basic 2008(VB 9.0)于2007年11月9日与Microsoft .NET Framework 3.5一起发布。
在VB2008中,微软增加了许多功能,包括:
Visual Basic 2010于2010年4月发布。
Visual Basic 2015(VB 14.0)于2015年7月20日发布。
2022 年 9 月 13 日 - Visual Studio 2022 17.0.14版 NewReleaseIcon
2022 年 8 月 9 日 - Visual Studio 2022 17.0.13版
2022 年 7 月 12 日 - Visual Studio 2022 17.0.12 版
2022 年 6 月 14 日 - Visual Studio 2022 17.0.11版
2022 年 5 月 10 日 - Visual Studio 2022 17.0.10 版
2022 年 4 月 19 日 - Visual Studio 2022 17.0.9版
2022 年 4 月 12 日 - Visual Studio 2022 17.0.8版
2022 年 3 月 8 日 - Visual Studio 2022 17.0.7 版
2022 年 2 月 8 日 - Visual Studio 2022 17.0.6版
2022 年 1 月 13 日 - Visual Studio 2022 17.0.5 版
2021 年12 月 16 日 - Visual Studio 2022 17.0.4版
2021 年 12 月 14 日 - Visual Studio 2022 17.0.3 版
2021 年 11 月 30 日 - Visual Studio 2022 17.0.2版
2021 年 11 月 16 日 - Visual Studio 2022 17.0.1版
2021 年 11 月 8 日 - Visual Studio 2022 17.0.0 版
相关
- 中脑中脑(英语:Midbrain)长约1.5公分,其腹面由桥脑延伸至间脑的乳头体(英语:Mammillary body),在两侧明显的突起称基脚(basis pedunculi),是由锥体运动系统及皮质桥脑径的纤维所组成。位于
- 圣马特奥县圣马特奥县(英语:San Mateo County),又译为圣马刁县,是美国加利福尼亚州的一县,位于旧金山湾区的西部,包含大部分的旧金山半岛。紧邻著圣马特奥县北边的是旧金山市与县,南边则是圣克
- 王倦王倦(20世纪?-),中国大陆编剧、剧本策划,其作品擅长推理和反转剧情。代表作《舞乐传奇》、《木府风云》、《大宋少年志》、《庆余年》等。
- 陈家悦陈家悦(1930年1月-2004年5月20日),男,广东文昌(今属海南)人,中华人民共和国政治人物,曾任致公党海南省委主委,海南省政协副主席,第七、八届全国人大代表,第九届全国政协委员。
- 江含章江含章(1916年-2008年),男,江西南丰人,中华人民共和国军事人物,中国人民解放军少将,曾任武汉军区副参谋长。
- RioRio在葡萄牙语中的意思是河流,也常被作为巴西里约热内卢的昵称。Rio或Río(葡萄牙语)也可以指:
- 卡努安岛卡努安岛(英语:Canouan)是圣文森特和格林纳丁斯的岛屿,位于圣文森特岛以南约40公里,属于格林纳丁斯群岛的一部分,长6.1公里、宽3.3公里,面积7.6平方公里,最高点海拔高度240米,人口约1
- 欧陆西班牙语欧陆西班牙语(西班牙语:Español europeo),又称西班牙西语(西班牙语:Español de España)、伊比利亚西班牙语(Español ibérico)、半岛西班牙语(Españo
- 2005年中国中央电视台春节联欢晚会2005年中国中央电视台春节联欢晚会,央视鸡年春晚,乙酉年春晚是中国中央电视台(CCTV)于2005年2月8日农历除夕为庆祝狗年新年举办的综艺性文艺晚会,于当晚20:00播出。此次春晚总导演由郎昆担任,司仪由朱军、周涛、李咏、董卿共同担任,此外还有32位地方台主持人助阵。
- 米亚·玛蒂娜玛蒂·约翰逊(英语:Martine Johnson,1984年1月14日-),艺名米亚·玛蒂娜(英语:Mia Martina),是一位加拿大流行音乐歌手,归属于CP Records唱片公司。2010年翻唱爱德华·玛雅和Vika Jigulina的Stereo Love,获得加拿大百强单曲榜的第十名,被提名竞逐加拿大Juno Awards年度最佳舞曲奖。2011年5月10日发布单曲 “Latin Moon”,最新单曲为“Burning”。玛蒂·约翰逊在圣伊尼亚斯(英语:Saint-Ignace, New B