Visual basic 2008
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的新独特之处:变量,类型,数组,属性。
的新独特之处:变量,类型,数组,属性在MSDN杂志2001年仲春版中我写了一篇文章,先容了新的架谈判用Visual 在这个平台下研发software所要遵照的法则。
在本文中,我先容了Microsoft彻底改造研发平台的动力和对VisualBasic语言做重大修改的根来历根底因。
此刻我先容的东西将成立在这个话题的根蒂根基之上,以是我假设你已读过:New Programming Model and Language Enhancements Boost Development Power本文,或已对.NET平台有了较深的理解.我在仲春份的文章中更多的是总体先容了commonlanguage runtime(CLR),此刻我将着意会商编程方面的新独特之处。
一朝你学会怎样运用这些个新的独特之处,我必定你也会以为是比以前版本更好的东西。
不外,我不成能在1个专栏中有关所有的新独特之处,以是这个月的专栏将是1个系列的初步,这个专栏系列将连续几个月。
要是你以前时常施用Visual Basic的话,你会发明有点认识,又有一点儿生疏。
在可以哄骗很多以前就具备的技法和常识的同时,仍然有很多东西要学。
很多公司破费了大笔的资金投资于Visual Basic6.0编著的software,这些个公司将面对怎样措置惩罚这些个已存在的software的不懂的题目。
我在先容Visual 新独特之处的同时,将会先容影响把代码移植到Visual 的要害地点。
正如你将瞅见的,会有很多不懂的题目要思量。
跟着编程语言变患上越
发相符、壮大和友善,你会发明把Visual Basic 6.0项目改写成Visual 项目需要很大的起劲和技能。
要是顺遂的话,你将有幸在不远的未来从零起头编著1个的项目。
新的便当:我起首将先容用一行代码使成为事实声明并初始化变量的新语法。
只管很多刚开始学者会以为这类语法是理所固然的,但现实上那一些已习气于在Visual Basic用两行代码来声明和初始化变量的步伐员会对此感应很欣慰。
这儿是哄骗了Visual 语法上风的3个例子:Dim xAs Integer=10 Dim obj1 As Class1=New Class1 Dim obj2 As New Class2请注重,与前两行纷歧样,最后一行用的是在Visual Basic 6.0中正当的语法,它在Visual 中同样是正当的。
然而,值当注重的是,这儿的As New语句在Visual and Visual Basic 6.0中的措置惩罚是差别的,很多有经验的步伐员阻挡施用As New语句,因为它将引起初始化的推迟,继续往前引起较低的执行效率,并给调试步伐带来了很多坚苦。
好动静是As New语法在Visual 中其实不会造成初始化的推迟,是以不会引起不异的不懂的题目。
在看前边的例子时,你应该注重第三行,它用了As New语句,但与前边几行具备同样的执行效率。
当你在Visual 中施用As New语句时,这个对象将在执行下一行以前被创立、初始化,并指派给你的变量。
这类利便的初始化语法也能够被用在类或布局的界说中。
正如你想患上那样子,语法应该是如许的:Class Class1 Private Field1 As Integer=10 Public Field2 As Class1=New Class1 End Class另外一点儿值当注重的是,当你在统一
行声明几个变量时,她们应该是不异类型的变量,请看这个例子:Dim x,y,z As Integer3个变量都被声明成integer类型,你再也不需要担忧前两个变量间或会被看成variant类型。
现实上,你不消担忧有啥子变量会被看成variant类型措置惩罚,因为variant类型再也不被CLR编程模子所撑持。
此刻的通用类型是System.Object.在Visual 添加长的语法中,我最喜欢的一点儿是此刻函数可以用Return来的方向它的挪用者归回1个值。
请看底下的例子:Function MyFunction()As String Return"Thellos is my return value"End Function这个例子和用其它语言(好比C语言)同样,Return语句将竣事函数的执行,并把节制权归回给挪用者。
我感觉施用Return 语句与咱们在VisualBasic的早期版本中的作法比拟要利便患上多。
正如你想的起来的,在以前的版本中,要归回给挪用者的值必需在函数的内部被赋给函数名。
因为在中施用了Return 语句,你可以很容易地使成为事实更改函数名或把代码从1个函数中复制、粘附到另外1个函数,而不需要搜刮函数的内部实质意义并替代本来的函数名。
消弭抵牾正如我在仲春份的文章中提到的那样子,在把1个对象指派给1个变量时,Visual 既不需要,也不容许你用Set这个要害字。
VisualBasic 6.0和Visual 的编译器有八下里纷歧样,这就是此中之一。
请看底下的代码:Dim obj1,obj2,obj3,obj4 As Class1 obj1=New Class1 obj2=obj1 Set obj3=New Class1 Set obj4=obj3第二行和第三行代码在Visual 中是正当的。
但在VisualBasic 6.0中编译时,它们将引起
运出发的日期纰缪。
第四行和第五行的代码在VisualBasic 6.0中是正当的,但在Visual 中却不克不及路程经过过程编译。
正如你想象的,在把代码从VisualBasic 6.0移植到Visual 时,需要出格注重对Set语句的改写。
在用Visual 编著了6个多月的步伐后,我发明本身仍然会施用Set语句,老习气是不易被戒除的。
并且因为事情的瓜葛,有好频频我患上在统一天即用,又用Visual Basic 6.0编著步伐。
不断地往返来去真地很坚苦。
在参量通报中括号的施用也发生了变化,这也给代码移植增长了坚苦。
你们中的很多人在颠末多年的编程然后已习气了挪用函数和子步伐的法则和独特之处。
小组感觉应该使成为事实挪用要领的相符性。
在Visual 中,参量通报的法则很简略。
当你挪用1个函数或子步伐并需要通报1个或多个参量时,必需用小括号把参量括起来。
当挪用1个不需要参量的函数或子步伐时,小括号可以被省略。
你只患上认可,与早期版本的VisualBasic中的法则比拟,这些个法则更直捷了当,也更易去学。
值当注重另外一点儿是参量通报的默许体式格局也转变了。
好比,当1个要领被界说成底下这类范式时,参量是怎样被传给挪用者的。
Sub Method1(Param1 As Integer)注解:implementation End Sub在Visual Basic以前的版本中,Param1是援用通报的。
也就是说在执行Method1时,转变这个integer类型的参量将引起挪用者中响应的现实参量的值的转变。
而在中,默许的参量通报体式格局酿成为了值通报。
也就是说执行Method1时,只是值被
通报给了Param1,并且在Method1中转变Parame1的值不会转变挪用者中响应的现实参量的值。
很较着,在把VisualBasic 6.0中代码移植到Visual ,这类参量通报默许体式格局的转变将粉碎一些代码的语义。
请注重,在上1个例子中,被通报到参量的是1个值而不是地址。
基本类型好比Byte,Integer,Double,and Boolean 都是值类型。
用户界说的列举和布局类型也是值类型。
在以值通报体式格局通报时,变量老是被复制。
当你通报的参量是基于类时,环境就差别了。
基于类的参量是援用类型而不是值类型。
它们被用来通报对象的援用。
要是1个挪用者通报了1个对象的援用给1个用了值通报体式格局的要领,在这个要领的使成为事实中,对象的状况有可能被转变。
这类状况的转变将反应到挪用者中。
是以,不管你把参量声明成值通报照旧援用通报,注重值类型照旧援用类型之间的区分是很重要的。
只管在要领中仍然可以施用可选参量,这仍是值当注重的处所。
与VisualBasic 6.0差别,施用可选参量需要1个默许值。
在统一行中,Visual 不撑持IsMissing函数,也就是说你区分不出1个省略了参量的挪用和1个给参量传了默许值的挪用。
要是你思量在要领中施用可选参量,你应该思量重载要领。
一朝你懂患了重载要领的利益和语法,你也许就会遏制在要领中施用可选参量。
更高级别的类型掩护很多施用Visual Basic的研发者但愿在每1个VisualBasic的源文件的开首能有1个Option Explicit语句。
Option Explicit的应用可以区分看待真实的研发者和姑且用户。
和以前的版本差别,Visual 缺省就施用Option
Explicit。
在编译时默许施用Option Strict是Visual 的另外1个独特之处。
施用了Option Strict后,由大变小转换就被克制了,因为它有可能会引起数值或精疏密程度的丢掉。
请看底下的例子:Dim xAs Double x=20.1 Dim yAs Integer注解:implicit narrowing conversion y=x注解:doesn注解:t compile under Option Strict最近代码在Visual Basic 6.0可以被编译路程经过过程,但在Visual 中,要是Option Strict语句被施用,它就不克不及被编译路程经过过程。
Option Strict的施用要患上步伐员必需对应该施用何品类型很清晰。
Dim xAs Double x=20.1 Dim yAs Integer注解:explicit narrowing conversion y=CInt(x)注解:compiles under Option Strict另外1个很大的变化是此刻If语句被优化了。
这代表了1个颇有价值的最优化,并且此刻当把代码移植到Visual 时,理解这将怎样影响基于Visual Basic 6.0的代码变患上很重要。
请看底下的代码:If Function1()And Function2()Then注解:statement block End If要是Function1归回了False值,那需要执行Function2以决议是不是要执行IfThen中的代码吗?很较着这是不需要的。
然而早期版本的Visual Basic并无像如许优化If语句,在不论什么环境下Function2都将被执行。
使成为事实了优化,是以当Function1归回值为False时,Function2不会被执行。
这是另外1个要患上基于VisualBasic 6.0的代码不克不及在Visual 中不错执行的因素。
此刻我想谈谈这个语言中在类型安全方面的另外1个革新。
你应该注重到,要是Function1或Function2
归回的值不是Boolean,那末前边的代码不克不及路程经过过程编译。
因为类型安全的级别更高了,你不成以用integer类型的值举行前提实验了。
好比底下的最近代码,在Visual Basic 6.0中是被时常施用的,但在Visual 中却不克不及路程经过过程编译。
Dim xAs Integer注解:set xto 0for false or anythellong else for true If xThen注解:execute statement block End If这类由Option Strict带来的新的类型安全级别要患上你在施用If和Doloops语句时,必需施用Boolean类型的值,而不克不及用其它类型的值。
在施用诸如Not、And、Or、Xor等的思维规律比力符时,你也被限定必需施用Boolean类型的值来输入输出。
这与在以前版本的VisualBasic中这些个比力符既可以用于思维规律比力又可以用于按位比力差别。
底下最近代码在VisualBasic 6.0中能正常运行,但在Visual 中却不克不及路程经过过程编译。
Dim xAs Integer Dim yAs Integer Dim zAs Integer x=3 Y=6 z=x And y注解:doesn注解:t compile Visual 供给了四种新的按位比力运算符:BitNot,BitAnd,BitOr,和BitXor。
这些个运算符容许你在类型安全的体式格局下实施按位比力运算。
好比,你可以用这些个运算符中的1个对两个integer值的每名来使成为事实OR运算,还可使成为事实位掩码。
底下是施用BitOr和BitAnd的1个例子:Dim xAs Integer=3 Dim yAs Integer=6 Dim zAs Integer注解:OR bits together z=x BitOr y注解:z now equals 7注解:AND to find intersection of bits z=x BitAnd y注解:z now equal 2预设数组声明和施用数组的基本语法发生了很大的变化。
起首,
数组的下凡别成为了零。
你不成以声明1个下凡为1的数组。
是以,OptionBase语句再也不被撑持。
别的,你在声明1个数组时必需用它的元素个数,而不是它的神仙居住之处来初始化。
这儿是1个例子:注解:declare an array with 3elements from 0to 2Dim array1⑶As Integer array1(0)=2 array1⑴=4 array1⑵=8上一段声明要是在Visual Basic 6.0中被施用,这个数组将有4个元素,下标从0到3。
而在中,这个数组有3个元素,下标从0到2。
在中,要是你的代码诡计拜候下标为3的数组元素,将引启运出发的日期破例。
好比:注解:index out of range exception array1⑶=16 Visual 为初始化数组供给了一种新的语法。
你可以只用一行代码完成数组的声明和初始化。
就像如许:new array initialization syntax Dim array1 As Integer()={2,4,8}注解:在Visual Basic的早期版本中,你可以用For Each轮回遍历1个数组。
Dim xAs Integer For Each xIn array1 Console.WriteLine(x)Next 同时,你也能够用For轮回和数组长度来遍历1个数组。
好比:Dim iAs Integer For i=0 To(array1.Length-1)Console.WriteLine(array1(i))Next iCLR和Visual 还撑持多维数组。
好比,当你想要1个二维数组时,你可以用底下3个技能中的1个来界说它:Dim array1(2,2)As Integer Dim array2 As Integer(,)Redim array2(2,2)Dim array3 As Integer(,)={{12,24},{10,20}}施用数组时,你应该懂患上,不仅只是语法变了,在运行时被措置惩罚的体式格局也发生了变化。
在CLR中,
数组被分配的地址空间老是在堆中。
当你向1个要领通报数组类型的参量时,你施用的援用通报而不是值通报。
这儿是互雷同报数组援用的3个要领:Dim array1(2,2)As Integer Dim array2 As Integer(,)Redim array2(2,2)Dim array3 As Integer(,)={{12,24},{10,20}}Method1在两个标的目的同时通报了数组援用,这一般用来的方向挪用者返次数组援用。
Method2和Method3从挪用者向要领的使成为事实中通报了数组援用。
请注重Method2的参量被声明一维数组,而在Method3中参量被声明成为了二维数组。
每1个数组对象担当了体系撑持的类System.Array 的焦点细节使成为事实和大众成员。
你可以参考在.NET platform SDK中有关System.Array的文档。
这个类供给了面向一般数组的使命的函数,好比清空、复制、克隆、搜刮和排序。
这儿是施用System.Array类供给的一些要领的例子:Dim array1 As Integer()={4,2,8,1}Dim array2 As Integer()注解:cloning an array array2=CType(array1.Clone(),Integer())注解:clearing an array System.Array.Clear(array1,0,array1.Length)注解:sorting an array System.Array.Sort(array2)注解:sorting an array in reverse order System.Array.Reverse(array2)请注重,你可以对不论什么基于IComparable界面使成为事实的数组施用排序操作。
CLR的焦点类型,好比Integer,Double,String,and Date,都被预设成使成为事实IComparable的了。
要是你想把数组按你想要的体式格局举行排序,你只要在类和布局中使成为事实IComparable接口就能够了。
属性
的新语法:我信赖你对在早期版本的Visual Basic怎样界说合施用属性很认识。
只管施用属性的缘故原由是不异的,但界说属性的语法已变了。
属性此刻必需用包孕Set块或Get块的属性机关器来界说。
底下是1个有private字段和public属性的类的例子:Class Class1注解:private field Private m_Name As String注解:public property Public Property Name As String Get Return m_Name End Get Set If Value""Then注解:Value is intrinsic variable m_Name=Value End If End Set End Property End Class请注重Set块中包罗了内部变量Value。
用这个内部变量向你在Set块中的属性使成为事实通报了由客户拟定的属性值。
别的,在Visual 中,步伐员再也不见有什么时候应施用Set属性,而什么时候应施用Let属性的困惑了。
1个属性必然是ReadWrite,ReadOnly,或WriteOnly的。
上边的例子演习了ReadWrite的属性。
底下的例子将演习怎样创立ReadOnly和WriteOnly的属性。
注解:ReadOnly property has Get but no Set Public ReadOnly Property FullName as String Get Return m_FirstName&""&m_LastName End Get End Property注解:WriteOnly property has Set but no Get Public WriteOnly Property Password as String Set m_Password=Value End Set End Property请注重,当你省略了Get块或Set块时,你必然要施用ReadOnly或WriteOnly要害字引患上属性和默许属性1个属性可以被指定1个或多个引患上。
这可使属性具备数组的独特之处。
请看底下的类:Class Class1 Private m_Names As String()={"Ted","Fred","Jed"}注解:
an indexed property Readonly Property Item(Index As Integer)As String Get Return m_Names(Index)End Get End Property End Class在客户端,你可以用底下的例子拜候Item属性。
Dim obj As New Class1 Dim s1 String s1=obj.Item(0)要是把这个例子作进一步的革新,你可以把1个引患上属性标志为类的默许属性。
为了使成为事实这一点儿,只要把Default要害字加到上1个例子中就能够了,就像如许:Default Readonly Property Item(Index As Integer)…一朝你为1个引患上属性标志了Default要害字,客户真个代码就能够省略属性的名儿而施用对象援用,就像施用1个数组同样。
Dim obj As New Class1 Dim s1 String s1=obj(0)请注重,对默许属性有1个重要的限定,即非引患上属性不成以被标志为默许属性。
这个限定在Visual 中表现了出来,因为你不成以用Set语句来指定1个对象援用。
既是Set语句再也不被Visual 所撑持,那末非引患上的默许属性将引起没有办法处理完成的多义性不懂的题目。
小结正如你所见到的那样子,在八下里Visual 都与它以前的版本差别。
它具备更高的相符性和类型安全级别。
别的,用Visual 咱们更易开具节制性、可读性很高的代码。
虽则它有时候要求你习气于那一些编译时分外的查抄,但它将在你实验和调试时,为你节约名贵的时间。
好动静是Visual Basic已被改为了一种更好、更强劲的语言。
而坏动静是在Visual Basic 6.0下编著的software需要做很多事情才可以被移植到Visual 下。
只管这个月的专栏有关了很多Visual Basic根蒂根基语法方面的焦点变
化,但另有很多没有有关。
我尚无有关迷人的面向对象的新独特之处,好比同享要领、要领重载、参量化机关器和担当。
请等候下一期的专栏。