Visual Basic .NET
✍ dations ◷ 2025-07-01 14:29:59 #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 版
相关
- 代谢疾病代谢疾病(代谢病)是一种影响人类(或动物)细胞生产能量的障碍,又称为新陈代谢失调症。大部分代谢疾病都是遗传性疾病,而有部分是从饮食、毒素、感染等而有。遗传性的代谢疾病一般
- 铝合金铝合金通常使用铜、锌、锰、硅、镁等合金元素,20世纪初由德国人Alfred Wilm发明,对飞机发展帮助极大,第一次大战后德国铝合金成分被列为国家机密。跟普通的碳钢相比有更轻及耐
- 刘绍臣刘绍臣(1944年4月26日-),台湾大气科学家,现担任中央研究院环境变迁研究中心特聘研究员并曾任该中心主任,并且是第29届中央研究院院士。于1944年生于中华民国河北省,父亲是当地的小
- F-15鹰式战斗机空对空导弹:AIM-7“麻雀”中程空对空导弹AIM-120“AMRAAM”先进中程空对空导弹AIM-9响尾蛇短程空对空导弹配置:四枚AIM-7麻雀导弹或四枚AIM-120先进中程空对空导弹,通常挂载于
- 海上护卫总司令部 (日本海军)海上护卫总司令部(日语:海上護衛総司令部/かいじょうごえいそうしれいぶ ?)是旧日本海军在太平洋战争后期设立、专司通商护卫的机构。海上护卫总司令部虽然是正式名称,不过很
- 村田谅太村田谅太(1986年1月12日-)是一名日本拳击运动员。他在2012年夏季奥林匹克运动会中,参加了男子拳击中量级比赛并获得金牌。他也参加了2011年世界拳击锦标赛,获得一枚银牌。
- 基伍树蝰基伍树蝰(学名:),又称毛鳞树蝮、鳞皮树蝮,是蛇亚目蝰蛇科下的一个有毒蛇种,主要分布于中非基伍地区。此蛇最明显的特征,是其身体遍布着茂密尖锐的刺状鳞片。目前未有任何亚种被确认
- 努纳武特地方旗努纳武特地区旗是加拿大努纳武特地区的官方旗帜,于1999年4月1日(即努纳武特地区成立当日)开始使用。旗帜左侧为黄色,右侧为白色,中央是一个红色因纽特石堆,右上有一颗蓝色五角星。
- 姜王后姜王后,宋代《全相武王伐纣平话》和明代《封神演义》中商纣王的王后。太子殷郊和殷洪之母,妲己死敌,商纣王所册封的第一个王后,为东伯侯姜桓楚之女,与纣王育有二子殷洪、殷郊。妲己入宫后用计陷害最终致使姜王后惨死,姜王后死后封为群星正神中的天府星。姜王后是东伯侯姜桓楚之女,美貌非凡,生下儿子殷郊、殷洪。当时妲己因姿色妖艳,刚选进宫,尊为贵妃,与姜氏不熟,但几个月后便认识了。两年后,姜氏封为王后,引起妲己的嫉妒,因此妲己便展开一连串的阴谋来陷害姜王后。姜氏被妲己陷害后,被商纣王贬为贵妃,并打入冷宫,姜氏被打入冷宫后
- 豫章书院修身教育专修学校豫章书院修身教育专修学校是中国大陆江西省南昌市一间于2013年成立,用以接收管教存在叛逆行为的青少年的学校,其前身是2007年建立的一家名为“龙悔学校”的戒网瘾学校和2011年年底成立的豫章书院德育学校,简称豫章书院。书院的公开资料显示书院重点开设青少年修身科课程,但学生们认为讲授正式课程较少,礼仪训练较多。许多学生指控学校设有一系列体罚政策来管理学生,高压甚至将学生逼迫至自杀,这严重损害了他们的身心健康。此书院在经网络曝光后引发了舆论广泛关注。2017年底,该校已主动申请停止办学。2019年,豫章书院再