“七侠五义特三五,二六相连看四五。电话137xxxx3339曾小姐(99期)”——这是我手机上收到的又一条短信息。这类垃圾广告整日出现,真是不厌其烦。
月度归档: 2003年11月
今天去看病了
中医学院。确诊为急性咽炎,喷喉、放血、点耳穴。回来后感觉好多了,晚餐也能进普通的食物。不过,铁板牛柳之类的东西还是太过刺激,搞得肠胃不是很舒服。看来病情明天应该会基本好转。北京之行暂时取消。
收到《程序员》和《开发高手》
之前只寄来开发高手第二期,催了一下,从9月份开始的两本杂志都寄过来了。其实我感觉开发高手第一期比第二期好,不知为什么读者反响却是第二期好一些。值得留意,也许我们真的还没能了解读者需求所在。
学院网站基本完成,大体上也可以放心走了。这段时间把视听课件用.NET重构一下,算是留给学校的纪念吧。
失眠
感觉自己不是自己,或者根本就没有感觉。人要么是醒着,要么是睡着。曾经以为自己醒的,往往是在做梦。管他,有梦也是好的,谁知道到底有没有醒这回事。
在凌晨五点一个激灵——为了自己渐趋浑噩的生命,也为了拼命不陷于浑噩却因此而更加浑噩的努力。人是逐渐瘦下来了,也易怒、焦躁。世界就这样,你说它永远在变化,其实一切都是不变的。就像花,有枯萎的时候,然而之前却是灿烂的。在枯萎以前,花尽直灿烂地绽放;这灿烂就是不变的,这枯萎也是不变的。有人把花种在温室里面,让它在冬天最冷的日子里开放;这些以为让“不变”最终变化了的人,哪里知道他们不过是在欺骗没有眼睛的花而已。在冬日的市场上,人们惊奇地指着叫着:反季节花!其实花儿何曾反了季节?在它小小的心灵里面,满心以为这就是春天了。所以,实在不是花没开对季节,真正反季节的,应该是温室,不,应该是人才对。
这样想着,天渐渐有些亮了。
.TEXT居然不能在随笔编辑界面贴图!
本来它用FTB控件,是支持上传贴图的,可是因为.TEXT接管了所有请求,把对上传图片aspx的请求转给default.aspx了。害得我搞了半天都不行,原来……真是有够恶心啊。改天得修理修理,没有贴图太烦人啦。
举重若轻的ASP.NET开发工具——Web Matrix
Matrix让你想起什么——对!黑客帝国。就在该片第二集火爆上映之时,一个以“Matrix”命名的ASP.NET开发工具也Reloaded(重装上阵)了。如果你斥巨资购买VS.NET而只用来开发网站应用,或是既买不起正版又不齿于盗版,那么你一定要试试Web Matrix。体积细小,功能强大,系出名门,完全免费……太多的理由让我们接受它。
好吧,Web Matrix到底有何高招?笔者最初也是抱着这个疑惑下载并安装了Web Matrix,一用之下不忍释手,再用之下竟为之叹服。且让我把它的“官方(其实Web Matrix何来官方可言)”特性介绍引来一观——我想告诉读者的是,下列的特性我一一试过,绝非广告。请看:
w以所见即所得方式设计ASP.NET和HTML页面。直接从工具盒拖放控件到页面,双击控件自动生成事件代码。更牛的是,当你放置一个自定义控件(.ascx)到页面,Web Matrix会正确地绘制它,这一点连VS.NET都没有做到。当然你也可以修改控件属性,使之符合要求。
w支持MS SQL Server/MSDE和Access数据库。直接拖放数据库对象到页面,通过向导生成ADO.NET访问代码。而且你还可以通过内建工具管理数据库(包括数据库、数据表、关系、存储过程、记录的创建、修改、删除等)。
w支持C#、VB.NET、J#编码。通过.NET Framework支持其它任何语言编写的ascx和aspx文件。不过“代码完成(code complete)”的功能欠奉,不能不说是极大的遗憾。
w自带Class Browser工具,.NET Framework对象体系一目了然。我还把它当作简明手册来使,方便得很。
w支持XML Web Service的创建和修改。
w支持移动应用(PDA、智能电话、呼机)编写。
w基于FTP或本地文件系统的项目管理。也就是说,你可以在远程FTP站点上“直接”编写ASP.NET应用页面。上传、下载等细节由Web Matrix内置的FTP功能执行,开发者无须进行繁琐的文件管理操作。想想Macromedia DreamWeaver的FTP站点管理功能,你不用关心站点更新问题,只要集中精力于开发本身。不过我建议你在测试站点端口使用这个功能,因为你根本保证不了每次编译结果都是完美的。我一般用81或82之类的端口和独立的目录做测试版本,在整个开发过程结束之后,再把站点移到正式目录。
w内建的Web Server。按下F5键,可以看到页面在本机8080端口运行了。这个特性的优点不言而喻——你甚至不需要安装IIS,就可以享受本机调试ASP.NET应用的方便。该内建WEB服务器还支持Web Service。
w我想特别提及的是Web Matrix的社区集成。在右下角toolbox的Community Tab中,有ASP.NET、Web Matrix相关站点、论坛、新闻组等社区资源列表。你可以在集成环境中立刻得到此中高手的技术支持。
Web Matrix由Microsoft ASP.NET开发组成员开发与维护。事实上,在某些方面,Web Matrix甚至是ASP.NET新功能的试炼场。因此,你不但可以感受到源自微软的技术实力,更可抢先尝试未来版本ASP.NET的某些特性。好了,下面是有关Web Matrix的一些资源地址,供读者参考。
Web Matrix“官方”站点: http://www.asp.net/webmatrix/default.aspx
Web Matrix下载:http://www.asp.net/webmatrix/download.aspx?tabindex=4
Web Matrix在线论坛:http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&ForumID=30?>从VB到VB.NET
作者 Mahesh Chand
翻译 韩磊
Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。本文将介绍VB.NET的新特性,并比较VB6.0/VB.NET之间的区别,阐述如何利用VB.NET编写简单的应用程序。
1.1 什么是 VB.NET?
VB.NET是VB6.0的后续版本。Microsoft推出全新的编程和操作系统Framework——.NET,支持多种语言利用公共.NET库开发应用程序,这些应用程序在.NET Framework上运行。使用Visual Basic在.NET Framework上编程,这就是VB.NET。
首先,让我演示在VB.NET中写最简单的控制台程序:Hello World。
1.2 Hello, World!
“Hello World!”是初学者学习Windows编程的代表性程序。我们的第一个程序就叫做“Hello VB.NET World!”。该程序在控制台输出一句话:“Hello VB.NET World!”,代码如下所示:
代码 1.1: Hello VB.NET World例子
Imports System
Module Module1
Sub
System.Console.WriteLine(“Hello VB.NET World!”)
End Sub
End Module
1.3 VB.NET 编辑器和编译器
你可以在记事本或VS.NET IDE等任意文本编辑器中撰写上述代码,然后保存为HelloWorld.vb。
代码编写完成之后,要么在命令行、要么在VS.NET IDE中编译它。在Microsoft .NET Framework SDK中已经包括VB.NET编译器vbc.exe[1],从IDE或是命令行都可以调用。要从命令行编译HelloWorld.vb,请在命令行窗口输入
vbc HelloWorld.vb /out:HelloWorld.exe /t:exe
编译结束后,HelloWorld.exe被创建到当前目录下。在资源管理其中双击图标或在命令行执行,程序正确地运行了。祝贺你进入VB.NET开发者的行列。
Imports 语句
如你所知,大部分的.NET类型都在名字空间(namespace)中定义。Namespace是定义和管理类别的范畴。察看.NET Framework Class Library,可以看到数以百计的namespace。例如,System namespace就包括了Console、Object等类型定义。如果想使用Console类,需要用Imports指令导入System namespace。如下所示:
Imports System
甚至可以明确地调用namespace而无需用Import导入。下面的例子展示了不用Import的“Hello World!”程序:
代码1.2: Hello VB.NET World例子
Module Module1
Sub
System.Console.WriteLine(“Hello VB.NET World!”)
End Sub
End Module
1.4 解析 “Hello VB.NET World!”
程序第一行是:
Imports System;
System namespace定义了Console类,该类用于读写控制台(命令行窗口)。
然后你定义了一个module:
Module Module1
…
End Module
所有的VB程序都包括一个Main()方法,即应用程序入口点。在例子程序中,我们调用Console.WriteLine()向控制台写入“Hello VB.NET World!”:
Sub
Console.WriteLine(“Hello VB.NET World!”)
End Sub
WriteLine()方法归属于Console类,它负责向控制台写一个带有行结束符的字符串。如前所述,Console类定义于System namespace,你通过直接引用来控制类成员。
Console类负责读写系统控制台。读控制台输入用Read和ReadLine方法,向控制台输出用WriteLine方法。
表1.1 Console类定义的方法
方法 | 用途 | 例子 |
Read | 读入单个字符 | int i = Console.Read(); |
ReadLine | 读入一行 | string str = Console.ReadLine(); |
Write | 写一行 | Console.Write(“Write: 1”); |
WriteLine | 写一行,并带上行结束符 | Console.WriteLine(“Test Output Data with Line”); |
1.5 VB.NET有什么新特点?
作为VB6.0的后续版本,VB.NET更加稳定,而且完全面向对象。也许你还记得,VB6.0部支持继承、重载和接口,所以不是真正面向对象的。而VB.NET则支持这些面向对象特性。VB6.0有两个薄弱环节——多线程和异常处理。在VB.NET中,开发多线程应用和使用C++/C#别无二致,结构化异常处理也得到支持。稍后我们会详细解释这些特性。
下面是VB.NET的特性列表——
·面向对象的编程语言。支持继承、重载、接口、共享成员和构造器。
·支持所有的CLS特性,如存取控制.NET类、与其它.NET语言交互、元数据、公共数据类型、委托等等。
·多线程支持。
·结构化异常处理。
1.6 名字空间与集合
前面讨论了我们的第一个VB.NET程序。该程序中首先引人注意的是名字空间(namespace)。在.NET参考文档中,你会发现每个类都归属于某个namespace。那么,namespace到底是什么?
一个namespace是类和组件的逻辑组合,其目的在于将.NET class按类别定义。微软借用了C++ class packaging概念:namespace来描述这种组合。.NET Framework中的组件被称为集合(assembly)。全部.NET代码在数百个库文件(DLL)中定义。Namespace把assembly中定义的类组织起来。一个namespace可以包括多个assembly,一个assembly也可以在多个namespace中定义。
namespace树的根节点是System namespace。在.NET Library中,每个class都在一组相似的类别中定义。例如,System.Data namespace只包括数据相关类。同样,System.Multithreading只包括多线程类。
在使用.NET支持的语言(如C#、VB.NET、C++.NET等)创建新应用程序时,你会注意到每个应用程序都被定义为一个namespace,而所有的class都归属于这个namespace。通过引用这个namespace,其它应用程序就能存取这些class。
在.NET中,代码被编译为中间语言(Intermediate Language,IL),assembly中存储了IL代码、元数据和其它资源文件。同一个assembly可以附属于一个或多个Exe/DLL。所有的.NET库都存储在assembly中。
1.7 VB.NET: 完全面向对象的编程语言
抽象、封装、多态、继承是面向对象语言的四个基本属性。VB6.0不支持继承,而VB.NET则不然。所以,和C++一样,VB.NET也是完全面向对象的编程语言。
Class 和 Module
VB.NET用Class…End Class语句对创建class。每个VB.NET至少包括一个Module(模块)。Module在Module…End Module语句对中实现。应用程序的主要模块是Main方法,亦即应用程序入口点。
和VB6.0一样,使用Function/Sub关键字可以定义方法。下面的例子显示了如何创建class、添加方法,并从主程序调用方法:
Imports System
Module Module1
Sub
Dim cls As TestClass = New TestClass
Console.WriteLine(cls.MyMethod)
End Sub
Class TestClass
Function MyMethod() As String
Return “Test Method”
End Function
End Class
End Module
Property
属性(Property)是类变量的公共描述。Property…End Property语句用以创建property。属性的Get/Set方法分别用于取得和设置属性值。下面的例子中,Data是TestClass的属性。
Imports System
Imports System.Console
Module Module1
Sub
Dim cls As TestClass = New TestClass
WriteLine(cls.MyMethod)
WriteLine(cls.Data)
cls.Data = “New Data”
WriteLine(cls.Data)
End Sub
End Module
Class TestClass
Private strData As String = “Some Data”
Function MyMethod() As String
Return “Test Method!”
End Function
‘ Adding Data property to the class
Public Property Data() As String
Get
Return strData
End Get
Set(ByVal Value As String)
strData = Value
End Set
End Property
重载
VB.NET通过overload关键字支持方法重载。使用这个关键字,你可以定义同名但不同参数的方法。
类成员访问域
除了原有的Private和Public,VB.NET引入了几个新关键字。全部访问域关键字列表如下:
关键字 | 作用域 |
Private | 限于class内部 |
Public | 可以从class外访问 |
Friend | 限于class所属的应用程序内 |
Protected | 只能被class和其派生类访问 |
Protected Friend | 能被class、应用程序和派生类访问 |
继承
继承是面向对象编程语言中最常用的技术。继承让你能够重用类代码和功能。
VB.NET支持继承,而VB6.0则不支持。继承的好处在于你能使用任何人编写的类,从这些类派生自己的类,然后在自己的类中调用父类功能。在下面的例子中,Class B派生自Class A,我们将从Class B中调用Class A的方法MethodA。
Imports System
Imports System.Console
Module Module1
Sub
Dim bObj As B = New B
WriteLine(bObj.MethodA())
End Sub
End Module
‘ Class A defined
Public Class A
Function MethodA() As String
Return “Method A is called.”
End Function
End Class
‘Class B, inherited from Class A. All members (Public and Protected)
‘ can be access via B now.
Public Class B
Inherits A
Function MethodB() As String
Return “Method B is called.”
End Function
End Class
可以从一个class中派生多个自定义class,也可以从多个class派生一个自定义class。
共享的成员
类的共享成员被类的所有实体共享。共享成员可能是属性、方法或字段/值域。在你不想让用户全面控制自己的类时,共享成员相当有用。例如,你可以开发一个类库,让用户通过共享成员使用其中的部分功能。
可以通过class本身引用共享成员,而无需通过类的实体。例如:
Module Module1
Sub Main()
WriteLine(A.MethodA())
End Sub
End Module
‘ Class A defined
Public Class A
Shared Function MethodA() As String
Return “Method A is called.”
End Function
End Class
多线程
VB语言的一大弱点就是缺乏编写自由线程(free-threaded)程序的能力。在.NET Framework中,所有语言共享CRL(Common Runtime Library,公共运行库),也就是说,你可以用VB.NET、C#或其它.NET语言编写同样的程序。
System.Threading namespace定义了线程类。我们只需要引入System.Threading namespace,即可使用线程类。
System.Threading.Thread类提供线程对象,可以使用Thread类创建或破坏线程。
创建线程
使用Thread类的实体创建一个新线程,然后用Thread.Start方法开始执行线程。线程构造器接受一个参数,该参数指明你要在线程中执行的procedure。在下例中,我想在oThread1(Thread类的一个实体)的第二线程中执行SecondThread过程:
oThread1 = New Thread(AddressOf SecondThread)
SecondThread procedure looks like below:
Public Sub SecondThread()
Dim i As Integer
For i = 1 To 10
Console.WriteLine(i.ToString())
Next
End Sub
然后,调用Thread.Start()开始线程:
oThread1.Start()
下面的代码创建两个第二线程:
Imports System
Imports System.Threading
Module Module1
Public oThread1 As Thread
Public oThread2 As Thread
Sub Main()
oThread1 = New Thread(AddressOf SecondThread)
oThread2 = New Thread(AddressOf ThirdThread)
oThread1.Start()
oThread2.Start()
End Sub
Public Sub SecondThread()
Dim i As Integer
For i = 1 To 10
Console.WriteLine(i.ToString())
Next
End Sub
Public Sub ThirdThread()
Dim i As Integer
For i = 1 To 10
Console.WriteLine(“A” + i.ToString())
Next
End Sub
End Module
破坏线程
调用Abort方法来破坏(中止)一个线程。在调用Abort之前,确保用IsAlive判断线程处于活动状态。
If oThread1.IsAlive Then
oThread1.Abort()
End If
暂停线程
可以使用Sleep方法来暂停线程执行。Sleep方法接受一个以毫秒为单位的参数,指明线程应当暂停多长时间。
下面的例子让线程暂停1秒钟:
oThread2.Sleep(1000)
你也可以使用Suspend和Resume方法来挂起和继续线程执行。
设定线程优先级
Thread类的Priority属性用于设定线程优先级。该属性可以设置为Normal,AboveNormal,BelowNormal,Highest和Lowest。如:
oThread2.Priority = ThreadPriority.Highest
线程与Apartment
使用ApartmentState属性设置线程的apartment类型,该属性值可以为STA,MTA或是Unknown[2]:
oThread.ApartmentState = ApartmentState.MTA
MTS意味着可以使用多线程模式,而STA则只能是单线程执行。
Public Enum ApartmentState
{
STA = 0,
MTA = 1,
Unknown = 2,
}
1.8 结构化异常处理
异常处理也被称之为错误处理。作为VB程序员,你一定对On Error Goto和On Error Resume Next这些VB6.0错误处理语句耳熟能详。这种类型的错误处理被称为非结构化异常处理(Unstructured Exception Handling)。而在VB.NET中,Microsoft推出了结构化异常处理机制。VB.NET支持类似C++的TryCatch..Finally控制。Try..Catch..Finally结构如下:
Try
‘ 可能导致异常的代码
Catch
‘ 当异常发生时处理异常的代码
Finally
‘ 清理现场
End Try
Try语句块用以抛出异常。如果异常发生,在Catch语句块中处理。Finally语句块是可选的,在需要释放资源时特别有用。
1.9 VB6.0与VB.NET的不同之处
除了上面谈到的语言进化,还有一些语法上的变化。所有这些语言和语法的变化在MSDN中均可查到,本文只作简单介绍。
数据类型(Data Type)的改变
VB.NET中有些数据类型得到改进。下面是变化对照表。
数据类型 | VB6.0 | VB.NET |
Integer | 16 bit size | 32 bit size |
Long | 32 bit size | 64 bit size |
Currency | 用于存储大浮点数 | 被decimal替代,支持更高精度 |
Variant | 可以存储任意类型数据 | 被Object类型替代,也可以存储任意类型数据,但结果更好 |
Date | Date类型被存储为double | 引入DateTime类型,用于存储不同格式的日期 |
在VB.NET中,Short数据类型是16 bit的。Short,Integer和Long都等同于CLR的System.Int16、System.Int32和System.Int64类型。
变量声明的变化
在VB6.0中,变量声明有许多限制。其中之一就是不能同行声明多个变量。如果一定要在一行中声明多个变量,就一定得指明每个变量的类型,否则将被默认为Variant类型。
Dim a1, a2 As Integer
Dim a3 As Integer, a4 As Integer
第一行中的a1是Variant类型,a2是Integer类型。第二行中两个变量都是Integer类型。
VB.NET支持同行声明多个变量,举例如下:
Dim a1, a2, a3 As Integer
变量初始化是另一个问题。在VB6.0中不能同时声明和初始化变量,而VB.NET则支持这个特性。
Dim name As String = “Mahesh”
System.Console.Write(name)
声明常量也可以照此办理:
Const DT_COUNT As Integer = 23
New关键字。在VB.NET中,New关键字用于创建对象。由于数据类型是对象,所以New关键字用以创建一个数据类型对象。
Dim i As Integer = New Integer()
i = 10
System.Console.WriteLine(i.ToString())
代码块级别支持。像C++一样,VB.NET支持代码块级别的作用域检查。在语句块中声明的变量只在块内有效。
For i = 1 To 10
Dim p As Long
System.Console.WriteLine(i.ToString())
Next
System.Console.WriteLine(p.ToString())
这段代码在VB.NET中会得到一个编译错误,因为p在For..Next语句块之外不可访问。在VB6.0中这段代码可以通过。
改进了的类型安全
在VB6.0中,当你声明一个对外部过程的引用时,可以指定任意类型的参数为As Any。Any关键字禁止了类型检查,允许任意数据类型传入和返回。
VB.NET不支持Any关键字。你必须指定每个参数和返回值的数据类型。
数组
VB.NET对数组作了明显的改动。
数组范围。在VB.NET中,你需要格外留意数组范围问题。VB6.0默认数组下界为0,故数组中的元素数量等与数组上界值加一。下面的数组界限从A(0)到A(10),共有11个元素:
Dim A(10) As Single
可以使用Option Base改变下界值为1。在VB.NET中,数组和C++一样,下界值为0,不支持Option Base。
注意:MSDN文档指出数组只能包括与其尺寸相等的元素数量,例如:
Dim A(10) As Integer
只能包括10个元素(从A(0)到A(9)),但在编译下面这段代码时我发现它运行良好,看起来数组中容纳了11个元素。
Dim A(10) As Integer
A(0) = 12
A(2) = 24
A(10) = 23
System.Console.WriteLine(A(0).ToString())
System.Console.WriteLine(A(10).ToString())
System.Console.WriteLine(UBound(A).ToString())
System.Console.WriteLine(LBound(A).ToString())
Lbound和Ubound分别返回 0与10。
ReDim和Fixed Array。你可以在VB6.0中指定固定长度的数组。
Dim ArrWeekDays(0 To 6) As Integer
这里的ArrWeekDays数组是固定长度的,不能用ReDim语句改变长度。VB.NET不支持固定长度数组,所以ReDim总是有效。
可以用下面两种方式声明数组:
Dim ArrWeekDays(6) As Integer
Dim ArrWeekDays() As Integer = {1, 2, 3, 4, 5, 6}
ReDim语句。在VB6.0中,ReDim用于初始化动态数组。在VB.NET中你不能把它当作声明用。ReDim只能用于改变数组长度,不过不能改变数组维度。
Variant对阵Object
VB6.0中的Variant数据类型能存储任意类型变量,VB.NET中Object具备相同能力。
算术操作符
VB.NET支持类似C++的快捷方式。下面的表格显示了常规操作与快捷操作的不同之处。快捷方式也可用于*、/、|、&等操作符。
操作符 常规语法 快捷方式
加法 A = A+5 A +=5
减法 A = A – 5 A -+ 5
固定长度字符串
在VB6.0中,可以在声明字符串时指定其长度。VB.NET不支持固定长度字符串。
布尔操作符
VB6.0中的And、Or或是Xor语句是按位操作符。而在VB.NET中,它们是布尔操作符。执行这些操作将返回true或false。VB.NET引入新操作符来完成按位操作。
操作符 描述
BitAnd 按位And
BitOr 按位Or
BitXor 按位Xor
BitNot 按位Not
结构与自定义类型
在VB6.0中,你使用Type…End Type语句块创建结构或自定义类型。例如:
Type StdRec
StdId As Integer
StdName As String
End Type
VB.NET引入新的语法:Structure。Type…End Type不再被支持。Structure…End Structure与C++用法相同。可以指定结构中每个元素的可访问域,如Public、Protected、Friend、Protected Friend、Private等。例如:
Structure StdRec
Public StdId As Integer
Public StdName As String
Private StdInternal As String
End Structure
VB.NET中的Structures就像类一样,也可以拥有方法和属性。
New和Nothing关键字
VB6.0中,AS New和Nothing关键字用于声明一个对象并初始化它。
VB.NET不支持隐式创建对象。如前所言,甚至连数据类型都是对象。你可以采用以下两种方法创建数据类型或对象:
Dim i As Integer
Dim i As Integer = New Integer()
// Do something
if i = Nothing Then
End If
不支持Set语句
VB6.0使用Set语句指派对象。例如:
Set myObj = new MyObject
Set a = b
在VB.NET中,不需要使用Set指派对象。例如:
myObj = new MyObj()
a = b
过程(procedure)语法的变化
在VB.NET中过程语法有了很多变化。例如类似C++的过程调用方式、ByVal(传值)为默认类型、Optional关键字、return语句等等。
类似C++的过程调用方式
VB6.0允许不用加圆括号调用过程(sub)。不过,用Call语句调用函数或sub时,一定要使用圆括号。例如:
Dim I as Integer
Call EvaluateData(2, i)
EvaluateData 2, i
在VB.NET中,所有的方法调用都需要圆括号,而Call语句则是可选的。
ByVal是默认参数类型
在VB6.0中,在调用函数或sub时ByRef(传址)是默认类型。那意味着所有改变将反映到传入的变量。VB.NET改变了这种方式。现在,默认的参数类型是ByVal(传值)。
Optional关键字
VB6.0使用Optional关键字可用来让用户决定传入一个默认值,之后在调用IsMissing函数判断参数是否有效。
而在VB.NET中,每个可选参数必须声明其默认值,无需调用IsMissing函数。例如:
Sub MyMethod(Optional ByVal i As Integer = 3)
VB.NET的Return语句与C++相似。使用Return语句把控制权从过程返还给调用者。在VB6.0中,Return语句与GoSub语句一起使用。VB.NET不再支持GoSub语句。
流程控制的改变
下面是VB.NET对流程控制语句的修改:
1. GoSub不再受到支持。
2. Call、Function和Sub语句均可用于调用过程。
3. On … GoSub和On … GoTo语句不再受支持。可以使用Select Case语句来替代。
4. While … Wend语句现在改为While…End While语句。不再支持Wend关键字。
小结
Visual Basic .NET是.NET版本的Visual Basic。通过本文你了解到VB.NET的基本概念,而且也从VB6.0开发者的角度对VB.NET进行了考察。
?>
我的Delphi书架
眼光在书架上扫过,想要为这篇命题作文找点素材。末了遗憾地发现,随着书架本身的逐渐升级,看书的时间却越来越少。最要命的是,连看书的心情竟也似乎变成了可望不可即的妙物。然而作文和程序一样,总是要写的。也许,现在少看书,是因为已经看了太多的书?还是书太多而无从选择?抑或是现在的书没有以前的好?这三种可能性中无论哪一种稍具成立的理由,大概都会引出一个结论——无论是对于程序员,还是对于从事其它职业的人,在其职业生涯中、甚至整个生命历程中,书籍的影响往往是靠前的。越先接触到的书,对人的影响越大。可悲的是在意识到这一点时,我们多半已经走了不少弯路,甚至在走了不少弯路之后仍未能得到确切、真实、有用的知识。曾身为初学者的我,不禁为初学者们暗中捏了一把汗。选书,难!
那么,书柜玻璃门里封存的书籍们,似乎也有了发挥余热的地方。虽然我不是专业程序员,但学习编程也有8年之久,利用Delphi协助教学工作也有4、5年。把我看书的经验(也许是不成熟的罢)介绍给初学者,在大家选书时能帮上一点小忙,这篇东西就算是功德圆满了。
几年前一个偶然的机会,有位朋友向我介绍Delphi,并极力推荐一本译作,英文原名Teach Yourself Delphi 3 in 21 days,译名早已忘记。记忆中译文质量尚可,且原书难度浅易,行文流畅,更可贵的是并不因“简”就“陋”,真是难得。可惜当时自朋友处借得,早已归还了。遍寻未果,上网一查才知道乖乖不得了。原来该书的作者Kent Reisdorph来头不小。该兄是著名Delphi第三方控件公司TurboPower的资深开发工程师,同时也是Borland Team B(在新闻组回答开发技术问题的小组)成员。当然就书的内容而言显得有些陈旧了。有兴趣的读者可以在这里全文阅读该书的D4版:http://www.cesis.lv/learn/delphi/fm.htm。
这本书让我彻底投入Delphi的怀抱。在之后的一段时间里,到处寻找有关Delphi的图书。买了不少垃圾,但也小有斩获。可以说,看得最仔细、从中所获也最多的图书,都是在这个阶段买的。其中的一些,甚至到今天仍然是时时翻阅的。让我来一一介绍它们。
Todd Miller和David Powell著,Special Edition Using Delphi 3;中文版由机械工业出版社出版,书名《Delphi 3开发使用手册》。Todd当时是Delphi开发支持部高级顾问,而David则任Borland Delphi资源支持工程师。两位作者对于Delphi的深刻理解,使得本书的价值大大提升了。单纯从“代码”或是“具体技术”来看,当然有过时的地方,但偶尔重温,仍能给人以启发。遗憾的是译文质量普通,印刷错误比比皆是,实在是糟蹋了一本好书。
Marco Cantù,Tim Gooch和John F. Lam著,Delphi Developer’s Handbook;中文版由电子工业出版社出版,书名《Delphi高级开发指南》。该书主要作者Marco是Delphi界尽人皆知的专业作者和技术支持专家,他的一系列Delphi技术书相当受欢迎。就这本书而言,其实是配合Marco的另一本著作——Mastering Delphi 3编写的,重点在于揭示MD3中未涉及的高级技术专题。光是看看章节标题就已经很吸引人了,举凡“流与持久性”、“运行时类型信息(RTTI)”、“进程与存储器”等章节,无疑不是针针见血,下下到肉,解决学习和开发过程中许多百思不得其解的问题。作者甚至不惜动用200多页、整整五章的篇幅来讨论如何扩展Delphi环境。除去介绍Open Tools API问题的专书之外(实在是太少了!因为Open Tools API根本没有正式的官方文档。),这本书恐怕就是最详细的了。
然后是Marco Cantù的著名Delphi技术书系列Mastering Delphi。我买的最早版本是Mastering Delphi 4;中文版同样是由电子工业出的,书名《Delphi 4从入门到精通》。这个系列紧跟Delphi升级的脚步,对应每一版本Delphi进行介绍。现在最新的版本是Mastering Delphi 7。我对该系列图书的看法是只买和自己当前所用Delphi版本相应的那本就好。在你有机会使用新版Delphi之前,从这本书中学习到的知识已经足用。假如你每次看Mastering Delphi的新版本都会如饥似渴、买之而后快,恐怕看书的态度需要改改才行——只要认认真真读过,你会发现书的主要结构并没有很大改变,只是撤换一些太陈旧的内容、补充新特性介绍而已。当然我无意贬低该系列图书的价值,它的价值早由市场的热烈追捧所体现。毋庸置疑这本书现在仍然是系统学习Delphi技术的权威读物之一。不过,在向它鞠躬之前,不妨以“赶潮头挣钱”为由竖竖中指,幽他一默。
另外一个经典系列是Steve Teixeira和Xavier Pacheco著Borland Delphi Developer’s Guide。我曾经有过一本中文版,不过出版社和中文书名都忘了,现在手头的是SAMS出的Delphi 6 Developer’s Guide英文原版。DDG系列和MD系列到底孰优孰劣,怕是上帝也难回答的问题吧。T-Rex、X(Steve Teixeira和Xavier Pacheco的昵称)二人均为Borland雇员。DDG6的前言就出自Borland Developer Relations部门的副总裁David Intersimone(David I)的手笔。就这一点而言似乎可以认为DDG系出名门;但Marco却更能从开发者的角度来审视Delphi。我的建议是,如果你买了MD,不妨也买一本相应版本的DDG,反之亦然。它们是竞争互补的关系,都有对方不能企及的优点,参照阅读则更为全面。对这两本书我想就不必多言了。总之,每位Delphi程序员都应该在开始学Delphi时就买一本DDG和一本MD;但是要记得,每种一本就够,真的。
还有一本不能不提的是Charlie Calvert著Delphi 4 Unleashed;中文版是机械工业出的,书名《Delphi 4编程技术内幕》。这同样是一个系列中的一本,其它两本分别是Delphi Unleashed和D2 Unleashed,中间缺了D3 Unleashed;而且,在D4 Unleashed之后也再也没有下文。还记得在深圳书城翻开这本书时,第一章就把我深深吸引住了。在这一章里,作者阐述了该书的风格和主要内容。请允许我引用一段——“我在写这本书是没有采用指南模式和参考模式,取而代之的是,我选择了一种描述性的风格,这意味着你可以坐在一张舒服的椅子上安静地进行阅读。……”而且,作者最终完美地实现了自己的承诺。Charlie在描述为该书写范例代码时巧妙地给初学者提出一些忠告:书写简单的代码–螺旋式上升–好OOP与差OOP的对比–注意灵活的事件处理程序–不断梳理代码和分离对象–避免使用隐藏数据交叉链接对象–简短的方法–避免特征漂移,真是用心良苦。这本书也正体现开发技术的专门化趋势——以章节为单位,就某一专门问题作深入探讨;看似不够系统,其实是在“深度”上下了功夫。
也是从这本书开始,我对Delphi图书的认识大体上定型了,开始更有针对性地选择读物,也从坊间寻得一些难得的佳作。Delphi类图书大体有系统介绍类、参考手册类、专门技术类,另外还有一类,名之为“杂锦”,此处不提。系统介绍类的,首推MD和DDG系列。参考手册类的,曾买过清华大学出版社的《Delphi 4.0/5.0类参考指南》、《Delphi 4.0/5.0高级类参考指南》。这套书实质上差不多等于VCL帮助文档的中文版,但在中文资料缺乏的年代,仍有其存在的价值。平时浏览尚可,关键是还是查在线帮助方便些。这类书中有两本是不可缺少的手边参考读物。一本是Ray Lischner著Delphi in a Nutshell;中文版由电力出版社出版,书名《Delphi技术手册》。为什么推荐这本书?首先是因为该书属于O’Reilly出版社著名的Nutshell(坚果)系列,而O’Reilly本身和坚果系列图书都是技术图书中“品质”的代名词。再者,作者Ray Lischner在开发界也算鼎鼎有名。他是加州技术学院的博士,Tempest Software公司创始人,之后执教于Oregon State University(俄勒冈州立大学),教授C++课程。Ray同时也是O’Reilly C++ in a Nutshell的作者。有趣的是,他还写过一本Shakespear for Dummies(莎士比亚傻瓜书),真是兴趣广泛。前年我在CoDelphi.com上推荐这本书时,曾有朋友颇不以为然,我猜想他们多半没仔细看过。该书不但以参考手册的形式系统介绍了Object Pascal,还就对象模型、运行时类型信息和并发编程等内容作了深入探讨,这些话题对于任何一个严肃的程序员都是有益的。然而和大多数引进版Delphi图书一样,其病在译文不佳。
另一本是Clay Shannon著Developer’s Guide to Delphi Trouble Shooting;中文版由电子科技大学出版社出版,书名《Delphi开发人员排错指南》。不认识Clay Shannon?那真是太可惜了,他可是Delphi Informant Magazine的高酬专栏作者,也常在BorCon上发表专场演说。这本书罗列了在Delphi程序设计中可能遇见的609种错误信息,分析其原因,并给出解决问题的参考方法;按字母顺序排列的错误信息检索,查起来非常方便。尽管在Delphi IDE中选定错误信息按F1也可以得到在线帮助,但与该书相比实在不可同日而语。翻阅书中条目,想起除错(Debug)的痛苦,自然就会深知“字字血泪”的意思了。读者要注意的是,这也是一个图书系列,到目前为止总共有两个版本,一个是Developer’s Guide to Delphi Trouble Shooting,1998年出版;另一个则是Tomes of Delphi: Developer’s Guide to Troubleshooting (Wordware Delphi Developer’s Library)。我手头电子科大出的是第一个版本,也可以说是稍稍过时的版本(对应Delphi 4),现在有没有新版本的中文版,我也不大清楚。
至于专门技术类图书,由于笔者开发应用领域有限,只能介绍自己熟悉的几本。一本是Eric Harmon著Delphi COM Programming;中文版由机械工业出版,书名《Delphi COM深入编程》。该书关于接口的描述值得一读,但整体而言尚欠“深入”,对于只想大体了解COM技术的Delphi开发者大概够用。一本是Keith Wood著Delphi Developer’s Guide to XML,尚无中文版。Keith也是Delphi Informant Magazine的资深作者,在圈内享有盛名。我曾代国内杂志向他约稿,他告知稿酬是“1000 USD for a small article”,而另一位DIM作者的开价不过是区区200USD而已。而这本厚达500页的Delphi XML技术专书,的确体现了Keith钻专门技术领域“牛角尖”的非凡功力。Delphi和XML在作者笔下融会贯通,竟无丝毫阻滞隔阂之感。该书大体上分为三个部分:介绍XML/Delphi中的XML(DOM/SAX)/Delphi实战XML,完整、充分、透彻地讲解了XML在Delphi中的应用。
还有一本是Alan C. Moore博士和John C.Penman著The Tomes of Delphi: Basic 32-Bit Communications Programming,无中文版。说来好笑,我在Amazon订购的是Chad Z. Hower(昵称Kudzu)的相关著作。Kudzu是Indy控件组的原作者和现在的核心开发组灵魂人物。此兄夏天住在俄国圣彼得堡,冬天在塞浦路斯享清福,过的是神仙日子。他在Delphi通讯开发技术方面的思路也是天马行空,干冒天下之大不韪,叫嚣“blocking方式比non-blocking方式好”。我无意比较这两种socket通讯方式的优劣,不过但就Indy而言,通过多线程解决阻塞死锁问题的思路的确是独具一格。读者可以在http://www.hower.org/Kudzu/得到关于Kudzu的更多信息和Indy技术资料。不过由于那本书最后以付费e-book的形式发布(http://www.atozedsoftware.com/Indy/Book/index.html,29欧元),就寄了这一本过来。回过头来讲Alan C.Moore的书,说实在话也很不错。内容涵盖Winsock API和TAPI,开发Winsock或TAPI通讯程序的Delphi程序员如果手上有这本书,无论是全书阅读还是置于案头参考,相信都会受益良多。最后我还想提及我国台湾省李维先生的一系列Delphi分布式开发著作。鉴于这些书在大陆热卖,就不多作介绍了。读者可以参考王行舟、陈省和我在《程序员》杂志三味书斋的一席清谈。
写到这里,作文就算是交差了。读者也许会不满意,而最不满意的恐怕还是我自己。书架上还有数本好书值得一赞;就提到的图书而言,介绍也失之简单。不过就这样简单地介绍,也已超出了编辑规定的字数。谁说Delphi无好书?到我的书架上翻翻看,也许有适合你的一本呢。