失眠

感觉自己不是自己,或者根本就没有感觉。人要么是醒着,要么是睡着。曾经以为自己醒的,往往是在做梦。管他,有梦也是好的,谁知道到底有没有醒这回事。

在凌晨五点一个激灵——为了自己渐趋浑噩的生命,也为了拼命不陷于浑噩却因此而更加浑噩的努力。人是逐渐瘦下来了,也易怒、焦躁。世界就这样,你说它永远在变化,其实一切都是不变的。就像花,有枯萎的时候,然而之前却是灿烂的。在枯萎以前,花尽直灿烂地绽放;这灿烂就是不变的,这枯萎也是不变的。有人把花种在温室里面,让它在冬天最冷的日子里开放;这些以为让“不变”最终变化了的人,哪里知道他们不过是在欺骗没有眼睛的花而已。在冬日的市场上,人们惊奇地指着叫着:反季节花!其实花儿何曾反了季节?在它小小的心灵里面,满心以为这就是春天了。所以,实在不是花没开对季节,真正反季节的,应该是温室,不,应该是人才对。

这样想着,天渐渐有些亮了。

.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.NETHTML页面。直接从工具盒拖放控件到页面,双击控件自动生成事件代码。更牛的是,当你放置一个自定义控件(.ascx)到页面,Web Matrix会正确地绘制它,这一点连VS.NET都没有做到。当然你也可以修改控件属性,使之符合要求。


       w支持MS SQL Server/MSDEAccess数据库。直接拖放数据库对象到页面,通过向导生成ADO.NET访问代码。而且你还可以通过内建工具管理数据库(包括数据库、数据表、关系、存储过程、记录的创建、修改、删除等)。


       w支持C#VB.NETJ#编码。通过.NET Framework支持其它任何语言编写的ascxaspx文件。不过“代码完成(code complete)”的功能欠奉,不能不说是极大的遗憾。


       w自带Class Browser工具,.NET Framework对象体系一目了然。我还把它当作简明手册来使,方便得很。


       w支持XML Web Service的创建和修改。


       w支持移动应用(PDA、智能电话、呼机)编写。


       w基于FTP或本地文件系统的项目管理。也就是说,你可以在远程FTP站点上“直接”编写ASP.NET应用页面。上传、下载等细节由Web Matrix内置的FTP功能执行,开发者无须进行繁琐的文件管理操作。想想Macromedia DreamWeaverFTP站点管理功能,你不用关心站点更新问题,只要集中精力于开发本身。不过我建议你在测试站点端口使用这个功能,因为你根本保证不了每次编译结果都是完美的。我一般用8182之类的端口和独立的目录做测试版本,在整个开发过程结束之后,再把站点移到正式目录。


       w内建的Web Server。按下F5键,可以看到页面在本机8080端口运行了。这个特性的优点不言而喻——你甚至不需要安装IIS,就可以享受本机调试ASP.NET应用的方便。该内建WEB服务器还支持Web Service


       w我想特别提及的是Web Matrix的社区集成。在右下角toolboxCommunity Tab中,有ASP.NETWeb Matrix相关站点、论坛、新闻组等社区资源列表。你可以在集成环境中立刻得到此中高手的技术支持。


       Web MatrixMicrosoft 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 .NETMicrosoft 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 Main()


        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就包括了ConsoleObject等类型定义。如果想使用Console类,需要用Imports指令导入System namespace。如下所示:


Imports System

甚至可以明确地调用namespace而无需用Import导入。下面的例子展示了不用Import的“Hello World!”程序:


代码1.2: Hello VB.NET World例子

Module Module1


    Sub Main()


        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 Main()


        Console.WriteLine(Hello VB.NET World!)
    End Sub


WriteLine()
方法归属于Console类,它负责向控制台写一个带有行结束符的字符串。如前所述,Console类定义于System namespace,你通过直接引用来控制类成员。


Console类负责读写系统控制台。读控制台输入用ReadReadLine方法,向控制台输出用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)中定义。Namespaceassembly中定义的类组织起来。一个namespace可以包括多个assembly,一个assembly也可以在多个namespace中定义。
 
namespace
树的根节点是System namespace。在.NET Library中,每个class都在一组相似的类别中定义。例如,System.Data namespace只包括数据相关类。同样,System.Multithreading只包括多线程类。


在使用.NET支持的语言(如C#VB.NETC++.NET等)创建新应用程序时,你会注意到每个应用程序都被定义为一个namespace,而所有的class都归属于这个namespace。通过引用这个namespace,其它应用程序就能存取这些class
 
.NET中,代码被编译为中间语言(Intermediate LanguageIL),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(模块)。ModuleModule…End Module语句对中实现。应用程序的主要模块是Main方法,亦即应用程序入口点。


VB6.0一样,使用Function/Sub关键字可以定义方法。下面的例子显示了如何创建class、添加方法,并从主程序调用方法:
 
Imports System


 


Module Module1


 


    Sub Main()


        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方法分别用于取得和设置属性值。下面的例子中,DataTestClass的属性。


Imports System


Imports System.Console


 


Module Module1


    Sub Main()


        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关键字支持方法重载。使用这个关键字,你可以定义同名但不同参数的方法。



类成员访问域

除了原有的PrivatePublicVB.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 Main()


        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中,所有语言共享CRLCommon Runtime Library,公共运行库),也就是说,你可以用VB.NETC#或其它.NET语言编写同样的程序。



System.Threading namespace
定义了线程类。我们只需要引入System.Threading namespace,即可使用线程类。



System.Threading.Thread
类提供线程对象,可以使用Thread类创建或破坏线程。



创建线程

使用Thread类的实体创建一个新线程,然后用Thread.Start方法开始执行线程。线程构造器接受一个参数,该参数指明你要在线程中执行的procedure。在下例中,我想在oThread1Thread类的一个实体)的第二线程中执行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)

你也可以使用SuspendResume方法来挂起和继续线程执行。




设定线程优先级

Thread
类的Priority属性用于设定线程优先级。该属性可以设置为NormalAboveNormalBelowNormalHighestLowest。如:



oThread2.Priority = ThreadPriority.Highest

线程与Apartment

使用ApartmentState属性设置线程的apartment类型,该属性值可以为STAMTA或是Unknown[2]



oThread.ApartmentState = ApartmentState.MTA

MTS
意味着可以使用多线程模式,而STA则只能是单线程执行。



Public Enum ApartmentState


{


STA = 0,


MTA = 1,


Unknown = 2,


}



1.8 结构化异常处理
异常处理也被称之为错误处理。作为VB程序员,你一定对On Error GotoOn 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.0VB.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的。ShortIntegerLong都等同于CLRSystem.Int16System.Int32System.Int64类型。
 

变量声明的变化

VB6.0中,变量声明有许多限制。其中之一就是不能同行声明多个变量。如果一定要在一行中声明多个变量,就一定得指明每个变量的类型,否则将被默认为Variant类型。



Dim a1, a2 As Integer 
Dim a3 As Integer, a4 As Integer 

第一行中的a1Variant类型,a2Integer类型。第二行中两个变量都是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中会得到一个编译错误,因为pFor..Next语句块之外不可访问。在VB6.0中这段代码可以通过。




改进了的类型安全


VB6.0中,当你声明一个对外部过程的引用时,可以指定任意类型的参数为As AnyAny关键字禁止了类型检查,允许任意数据类型传入和返回。



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分别返回 010

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.NETObject具备相同能力。



算术操作符
VB.NET
支持类似C++的快捷方式。下面的表格显示了常规操作与快捷操作的不同之处。快捷方式也可用于*/|&等操作符。



操作符        常规语法     快捷方式
加法           A = A+5    A +=5 
减法         A = A – 5  A -+ 5

固定长度字符串


VB6.0中,可以在声明字符串时指定其长度。VB.NET不支持固定长度字符串。



布尔操作符
VB6.0
中的AndOr或是Xor语句是按位操作符。而在VB.NET中,它们是布尔操作符。执行这些操作将返回truefalseVB.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
引入新的语法:StructureType…End Type不再被支持。Structure…End StructureC++用法相同。可以指定结构中每个元素的可访问域,如PublicProtectedFriendProtected FriendPrivate等。例如:



Structure StdRec 


Public StdId As Integer 
Public StdName As String 


Private StdInternal As String 
End Structure

VB.NET
中的Structures就像类一样,也可以拥有方法和属性。

New
Nothing关键字

VB6.0
中,AS NewNothing关键字用于声明一个对象并初始化它。
 
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中,在调用函数或subByRef(传址)是默认类型。那意味着所有改变将反映到传入的变量。VB.NET改变了这种方式。现在,默认的参数类型是ByVal(传值)。
 
Optional
关键字
VB6.0
使用Optional关键字可用来让用户决定传入一个默认值,之后在调用IsMissing函数判断参数是否有效。
 
而在VB.NET中,每个可选参数必须声明其默认值,无需调用IsMissing函数。例如:

Sub MyMethod(Optional ByVal i As Integer = 3) 

Return语句
VB.NETReturn语句与C++相似。使用Return语句把控制权从过程返还给调用者。在VB6.0中,Return语句与GoSub语句一起使用。VB.NET不再支持GoSub语句。


流程控制的改变
下面是VB.NET对流程控制语句的修改:

1. GoSub
不再受到支持。

2. Call
FunctionSub语句均可用于调用过程。

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进行了考察。




[1] 译注:这意味着你无需购买VS.NET即可进行VB.NET开发



[2] 译注:STA-Single Threaded ApartmentMTA-Multi Threaded Apartment

?>

我的Delphi书架

眼光在书架上扫过,想要为这篇命题作文找点素材。末了遗憾地发现,随着书架本身的逐渐升级,看书的时间却越来越少。最要命的是,连看书的心情竟也似乎变成了可望不可即的妙物。然而作文和程序一样,总是要写的。也许,现在少看书,是因为已经看了太多的书?还是书太多而无从选择?抑或是现在的书没有以前的好?这三种可能性中无论哪一种稍具成立的理由,大概都会引出一个结论——无论是对于程序员,还是对于从事其它职业的人,在其职业生涯中、甚至整个生命历程中,书籍的影响往往是靠前的。越先接触到的书,对人的影响越大。可悲的是在意识到这一点时,我们多半已经走了不少弯路,甚至在走了不少弯路之后仍未能得到确切、真实、有用的知识。曾身为初学者的我,不禁为初学者们暗中捏了一把汗。选书,难!

那么,书柜玻璃门里封存的书籍们,似乎也有了发挥余热的地方。虽然我不是专业程序员,但学习编程也有8年之久,利用Delphi协助教学工作也有45年。把我看书的经验(也许是不成熟的罢)介绍给初学者,在大家选书时能帮上一点小忙,这篇东西就算是功德圆满了。

几年前一个偶然的机会,有位朋友向我介绍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 MillerDavid Powell著,Special Edition Using Delphi 3;中文版由机械工业出版社出版,书名《Delphi 3开发使用手册》。Todd当时是Delphi开发支持部高级顾问,而David则任Borland Delphi资源支持工程师。两位作者对于Delphi的深刻理解,使得本书的价值大大提升了。单纯从“代码”或是“具体技术”来看,当然有过时的地方,但偶尔重温,仍能给人以启发。遗憾的是译文质量普通,印刷错误比比皆是,实在是糟蹋了一本好书。

Marco CantùTim GoochJohn F. Lam著,Delphi Developer’s Handbook;中文版由电子工业出版社出版,书名《Delphi高级开发指南》。该书主要作者MarcoDelphi界尽人皆知的专业作者和技术支持专家,他的一系列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 TeixeiraXavier PachecoBorland Delphi Developer’s Guide。我曾经有过一本中文版,不过出版社和中文书名都忘了,现在手头的是SAMS出的Delphi 6 Developer’s Guide英文原版。DDG系列和MD系列到底孰优孰劣,怕是上帝也难回答的问题吧。T-RexXSteve TeixeiraXavier Pacheco的昵称)二人均为Borland雇员。DDG6的前言就出自Borland Developer Relations部门的副总裁David IntersimoneDavid I)的手笔。就这一点而言似乎可以认为DDG系出名门;但Marco却更能从开发者的角度来审视Delphi。我的建议是,如果你买了MD,不妨也买一本相应版本的DDG,反之亦然。它们是竞争互补的关系,都有对方不能企及的优点,参照阅读则更为全面。对这两本书我想就不必多言了。总之,每位Delphi程序员都应该在开始学Delphi时就买一本DDG和一本MD;但是要记得,每种一本就够,真的。

还有一本不能不提的是Charlie CalvertDelphi 4 Unleashed;中文版是机械工业出的,书名《Delphi 4编程技术内幕》。这同样是一个系列中的一本,其它两本分别是Delphi UnleashedD2 Unleashed,中间缺了D3 Unleashed;而且,在D4 Unleashed之后也再也没有下文。还记得在深圳书城翻开这本书时,第一章就把我深深吸引住了。在这一章里,作者阐述了该书的风格和主要内容。请允许我引用一段——“我在写这本书是没有采用指南模式和参考模式,取而代之的是,我选择了一种描述性的风格,这意味着你可以坐在一张舒服的椅子上安静地进行阅读。……”而且,作者最终完美地实现了自己的承诺。Charlie在描述为该书写范例代码时巧妙地给初学者提出一些忠告:书写简单的代码螺旋式上升OOP与差OOP的对比注意灵活的事件处理程序不断梳理代码和分离对象避免使用隐藏数据交叉链接对象简短的方法避免特征漂移,真是用心良苦。这本书也正体现开发技术的专门化趋势——以章节为单位,就某一专门问题作深入探讨;看似不够系统,其实是在“深度”上下了功夫。

也是从这本书开始,我对Delphi图书的认识大体上定型了,开始更有针对性地选择读物,也从坊间寻得一些难得的佳作。Delphi类图书大体有系统介绍类、参考手册类、专门技术类,另外还有一类,名之为“杂锦”,此处不提。系统介绍类的,首推MDDDG系列。参考手册类的,曾买过清华大学出版社的《Delphi 4.0/5.0类参考指南》、《Delphi 4.0/5.0高级类参考指南》。这套书实质上差不多等于VCL帮助文档的中文版,但在中文资料缺乏的年代,仍有其存在的价值。平时浏览尚可,关键是还是查在线帮助方便些。这类书中有两本是不可缺少的手边参考读物。一本是Ray LischnerDelphi 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 ShannonDeveloper’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 Shooting1998年出版;另一个则是Tomes of Delphi: Developer’s Guide to Troubleshooting (Wordware Delphi Developer’s Library)。我手头电子科大出的是第一个版本,也可以说是稍稍过时的版本(对应Delphi 4),现在有没有新版本的中文版,我也不大清楚。

至于专门技术类图书,由于笔者开发应用领域有限,只能介绍自己熟悉的几本。一本是Eric HarmonDelphi COM Programming;中文版由机械工业出版,书名《Delphi COM深入编程》。该书关于接口的描述值得一读,但整体而言尚欠“深入”,对于只想大体了解COM技术的Delphi开发者大概够用。一本是Keith WoodDelphi Developer’s Guide to XML,尚无中文版。Keith也是Delphi Informant Magazine的资深作者,在圈内享有盛名。我曾代国内杂志向他约稿,他告知稿酬是“1000 USD for a small article”,而另一位DIM作者的开价不过是区区200USD而已。而这本厚达500页的Delphi XML技术专书,的确体现了Keith钻专门技术领域“牛角尖”的非凡功力。DelphiXML在作者笔下融会贯通,竟无丝毫阻滞隔阂之感。该书大体上分为三个部分:介绍XML/Delphi中的XMLDOM/SAX/Delphi实战XML,完整、充分、透彻地讲解了XMLDelphi中的应用。

还有一本是Alan C. Moore博士和John C.PenmanThe Tomes of Delphi: Basic 32-Bit Communications Programming,无中文版。说来好笑,我在Amazon订购的是Chad Z. Hower(昵称Kudzu)的相关著作。KudzuIndy控件组的原作者和现在的核心开发组灵魂人物。此兄夏天住在俄国圣彼得堡,冬天在塞浦路斯享清福,过的是神仙日子。他在Delphi通讯开发技术方面的思路也是天马行空,干冒天下之大不韪,叫嚣“blocking方式比non-blocking方式好”。我无意比较这两种socket通讯方式的优劣,不过但就Indy而言,通过多线程解决阻塞死锁问题的思路的确是独具一格。读者可以在http://www.hower.org/Kudzu/得到关于Kudzu的更多信息和Indy技术资料。不过由于那本书最后以付费e-book的形式发布(http://www.atozedsoftware.com/Indy/Book/index.html29欧元),就寄了这一本过来。回过头来讲Alan C.Moore的书,说实在话也很不错。内容涵盖Winsock APITAPI,开发WinsockTAPI通讯程序的Delphi程序员如果手上有这本书,无论是全书阅读还是置于案头参考,相信都会受益良多。最后我还想提及我国台湾省李维先生的一系列Delphi分布式开发著作。鉴于这些书在大陆热卖,就不多作介绍了。读者可以参考王行舟、陈省和我在《程序员》杂志三味书斋的一席清谈。

 

写到这里,作文就算是交差了。读者也许会不满意,而最不满意的恐怕还是我自己。书架上还有数本好书值得一赞;就提到的图书而言,介绍也失之简单。不过就这样简单地介绍,也已超出了编辑规定的字数。谁说Delphi无好书?到我的书架上翻翻看,也许有适合你的一本呢。

昨天看了黑客III

不错。

安装开心汉化版.Text失败

发不了随笔,不知道为什么……

这个看起来不错

About FxCop

FxCop is a code analysis tool that checks .NET managed code assemblies for conformance to the Microsoft .NET Framework Design Guidelines. It uses reflection, MSIL parsing, and callgraph analysis to inspect assemblies for more than 200 defects in the following areas: naming conventions, library design, localization, security, and performance (see Rule Topics). FxCop includes both GUI and command line versions of the tool, as well as an SDK to create your own rules.

Download FxCop 1.23

FxCop must be running under the same version of the .NET Framework as that used to compile the assemblies it analyzes.
Please select the correct version of FxCop.

兵器谱之Application Block

其实有很多工具被我们忽略了。例如这个早已出现的Application Block,
是微软出的一个.NET Helper工具包,包括一个数据库工具和一个异常处理工具。

#数据库工具:执行SQL命令、存储过程并返回DataReader或DataSet或不返回;
#异常处理工具:处理、跟踪、记录异常

学术=不学无术?

今天参加了一个所谓的“学术研讨会”,结果搞得自己很郁闷。有些演讲人,连自己都没搞清楚的问题,怎么好意思拿到大庭广众之下现眼?!
难道真是学术就是不学无术?郁闷ing…>