2008年12月30日星期二
vbnet代码好久没写了,有点遗忘
最近一直用asp写网站,现在很少写软件了,曾经是我的长项,现在渐渐的遗忘了。其实做一个很复杂的网站并不比做软件简单,因为他需要了解很多方面的知识,很广,不过根据现在情况做网站比较有前途。因为是net时代了,所以还是写网络程序比较吃香啊。
2008年12月17日星期三
VB.Net对象成员
关 键 词:
对象是面向对象的编程中的基本单位。一个对象就是应用程序的一个元素,代表类的一个“实例”。字段、属性、方法和事件是对象的生成块,以及构成它们的“成员”。
对象
通过依次指定对象变量的名称、句点 (.) 和成员的名称来访问对象的成员。下面的示例设置 Label 对象的 Text 属性。
warningLabel.Text = "Data not saved" 字段和属性
“方法”是对象可以执行的操作。例如,Add 是 ComboBox 对象的一个方法,它向组合框中添加新项。
下面的示例阐释了 Timer 对象的 Start 方法。
Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()注意,一个方法只是由对象公开的一个“过程”。
有关更多信息,请参见如何:使用方法执行操作。
事件
从某个类创建对象时,得到的就是该类的一个实例。不用 Shared (Visual Basic) 关键字声明的成员是“实例成员”,它们严格属于那个特定的实例。一个实例中的实例成员与同一个类的其他实例中的相同成员无关。例如,一个实例成员变量在不同的实例中可以有不同的值。
用 Shared 关键字声明的成员是“共享成员”,这些成员作为一个整体属于类,而不属于任何特定的实例。共享成员仅存在一次,不管为它的类创建了多少实例,也不管是否未创建任何实例。例如,一个共享成员变量只有一个值,这个值对可以访问该类的所有代码均可用。
成员的 IntelliSense 列表
IntelliSense 在您激活它的“列出成员”选项时列出类的成员,例如当您将句点 (.) 作为成员访问运算符键入时。如果您键入的句点跟在某个声明为该类的一个实例的变量的名称之后,则 IntelliSense 列出所有实例成员,而不列出任何共享成员。如果键入的句点跟在类名本身之后,则 IntelliSense 只列出所有共享成员,而不列出任何实例成员。有关更多信息,请参见使用 IntelliSense。
对象是面向对象的编程中的基本单位。一个对象就是应用程序的一个元素,代表类的一个“实例”。字段、属性、方法和事件是对象的生成块,以及构成它们的“成员”。
对象
通过依次指定对象变量的名称、句点 (.) 和成员的名称来访问对象的成员。下面的示例设置 Label 对象的 Text 属性。
warningLabel.Text = "Data not saved" 字段和属性
“方法”是对象可以执行的操作。例如,Add 是 ComboBox 对象的一个方法,它向组合框中添加新项。
下面的示例阐释了 Timer 对象的 Start 方法。
Dim safetyTimer As New System.Windows.Forms.Timer
safetyTimer.Start()注意,一个方法只是由对象公开的一个“过程”。
有关更多信息,请参见如何:使用方法执行操作。
事件
从某个类创建对象时,得到的就是该类的一个实例。不用 Shared (Visual Basic) 关键字声明的成员是“实例成员”,它们严格属于那个特定的实例。一个实例中的实例成员与同一个类的其他实例中的相同成员无关。例如,一个实例成员变量在不同的实例中可以有不同的值。
用 Shared 关键字声明的成员是“共享成员”,这些成员作为一个整体属于类,而不属于任何特定的实例。共享成员仅存在一次,不管为它的类创建了多少实例,也不管是否未创建任何实例。例如,一个共享成员变量只有一个值,这个值对可以访问该类的所有代码均可用。
成员的 IntelliSense 列表
IntelliSense 在您激活它的“列出成员”选项时列出类的成员,例如当您将句点 (.) 作为成员访问运算符键入时。如果您键入的句点跟在某个声明为该类的一个实例的变量的名称之后,则 IntelliSense 列出所有实例成员,而不列出任何共享成员。如果键入的句点跟在类名本身之后,则 IntelliSense 只列出所有共享成员,而不列出任何实例成员。有关更多信息,请参见使用 IntelliSense。
2008年12月16日星期二
VB.net实现sql数据库的备份与恢复
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click '备份数据库 'BACKUP DATABASE Test TO DISK='C:\Backup' WITH Format Dim cn As SqlConnection Dim cm As SqlCommand cn = getDB() cm = New SqlCommand("BACKUP DATABASE JXbase TO DISK='C:\Backup ' WITH Format", cn) cn.Open() cm.ExecuteNonQuery() MsgBox("备份成功") cn.Close()
End Sub
'恢复 Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Dim cn As New SqlConnection Dim cn1 As New SqlConnection Dim mydr As SqlDataReader Dim str As String
Dim tmpConnectionString As String = "Data Source=JJK;Initial Catalog=master;Integrated Security=True" cn.ConnectionString = tmpConnectionString cn1.ConnectionString = tmpConnectionString cn.Open() cn1.Open() Dim cm As SqlCommand = New SqlCommand("select spid from master..sysprocesses where dbid=db_id('JXbase')", cn) mydr = cm.ExecuteReader()
Dim cm1 As SqlCommand = New SqlCommand() cm1.Connection = cn1
While (mydr.Read()) '杀死进程
str = "kill " & mydr("spid").ToString() cm1.CommandText = str cm1.CommandType = CommandType.Text Application.DoEvents() cm1.ExecuteNonQuery() '杀进程 End While mydr.Close() cm = New SqlCommand("RESTORE DATABASE JXbase FROM DISK='C:\Backup'", cn) '恢复备份 cm.ExecuteNonQuery() MsgBox("恢复成功成功") cn.Close() cn1.Close()
End Sub
End Sub
'恢复 Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Dim cn As New SqlConnection Dim cn1 As New SqlConnection Dim mydr As SqlDataReader Dim str As String
Dim tmpConnectionString As String = "Data Source=JJK;Initial Catalog=master;Integrated Security=True" cn.ConnectionString = tmpConnectionString cn1.ConnectionString = tmpConnectionString cn.Open() cn1.Open() Dim cm As SqlCommand = New SqlCommand("select spid from master..sysprocesses where dbid=db_id('JXbase')", cn) mydr = cm.ExecuteReader()
Dim cm1 As SqlCommand = New SqlCommand() cm1.Connection = cn1
While (mydr.Read()) '杀死进程
str = "kill " & mydr("spid").ToString() cm1.CommandText = str cm1.CommandType = CommandType.Text Application.DoEvents() cm1.ExecuteNonQuery() '杀进程 End While mydr.Close() cm = New SqlCommand("RESTORE DATABASE JXbase FROM DISK='C:\Backup'", cn) '恢复备份 cm.ExecuteNonQuery() MsgBox("恢复成功成功") cn.Close() cn1.Close()
End Sub
Visual Basic.Net基础概念和语法
从基础概念和语法开始,学一门语言,特别是现在都是可视化的开发了,但我建议还是不要急着先去拖拉几个控件,而是踏踏实实的先了解一下这门语言的概念、语法和规范。VB.Net虽然和以前的VB6在语法上非常的接近,但由于现在的VB.Net是全新的面向对象的语言,所以两者还是有些区别的。
正如大家所知道的,现在VB.Net已经全面支持各种面向对象的特性了,并且还有了一些其他.Net环境所需要的特性:继承、重载、重写属性和方法、实现构造函数和析构函数、接口、委托、异常、命名空间、程序集、特征编程、多线程、共享成员。(我们在后面的笔记中会逐步的来探讨这些特征的。)
先简单的描述一下VB.Net的语法,虽然它和VB6是如此的象像。所以讲述VB.Net的语句其实是对VB6语句的回顾,但有些语句是原先VB6所没有的。
VB.Net语句分为:声明语句、赋值语句、条件语句、循环语句、数组处理语句、异常语句、控制流语句、调用语句、锁语句
声明语句
在VB.Net、中声明往往是指变量的声明。
对于局部变量我们使用Dim修饰符进行声明。并且依然可以使用Const来修饰该变量为常数,Static作为描述静态变量依然有效。
声明举例(对于类和数组我们在后面描述)
以下是引用片段:
Const s As String = "Hello" '常数局部变量
Dim b As Boolean '规则局部变量
Static i As Int32 '静态局部变量
变量的可访问性
上面的三个变量都是局部变量,我们知道局部变量只在声明它们的区域是可见的,在该范围外是无法访问的,对于那些需要更多访问的控制,VB.Net提供了更丰富的修饰关键字。
可访问性修饰
描述
Public
声明元素为公共的,对公共元素的可访问性没有限制。
Private
声明元素仅可以从同一模块、类或结构内访问。
Protected
声明元素仅可以从同一个类内,或该类的派生类中访问。
Friend
声明元素可以从同一个项目内访问,但不能从项目外部访问。
Protected Friend
声明元素可以从派生类或同一项目内或二者进行访问。
可访问性举例(注意TestB,TestC和TestA的关系)
以下是引用片段:
Public Class TestA
Public i As Int32 = 100 '访问无限制
Private s As String = "Hello" '只有TestA可以访问
Protected b As Boolean = True '只有TestA和它的派生类可以访问
Friend d As Double = 3.1415926 '只有同项目类可以访问
Protected Friend l As Long = 100000 '
End Class
Public Class TestB
Inherits TestA'继承TestA
Public Sub New()
MyBase.b = False
MyBase.d = 3.14
MyBase.i = 10
MyBase.l = 10000
End Sub
End Class
Public Class TestC
Public Sub New()
Dim a As New TestA
a.d = 3.14
a.i = 10
a.l = 1000
End Sub
End Class
怎么样,是不是很简单啊,如果你有VB6的基础的话,相信很快就能过渡到VB.net。
正如大家所知道的,现在VB.Net已经全面支持各种面向对象的特性了,并且还有了一些其他.Net环境所需要的特性:继承、重载、重写属性和方法、实现构造函数和析构函数、接口、委托、异常、命名空间、程序集、特征编程、多线程、共享成员。(我们在后面的笔记中会逐步的来探讨这些特征的。)
先简单的描述一下VB.Net的语法,虽然它和VB6是如此的象像。所以讲述VB.Net的语句其实是对VB6语句的回顾,但有些语句是原先VB6所没有的。
VB.Net语句分为:声明语句、赋值语句、条件语句、循环语句、数组处理语句、异常语句、控制流语句、调用语句、锁语句
声明语句
在VB.Net、中声明往往是指变量的声明。
对于局部变量我们使用Dim修饰符进行声明。并且依然可以使用Const来修饰该变量为常数,Static作为描述静态变量依然有效。
声明举例(对于类和数组我们在后面描述)
以下是引用片段:
Const s As String = "Hello" '常数局部变量
Dim b As Boolean '规则局部变量
Static i As Int32 '静态局部变量
变量的可访问性
上面的三个变量都是局部变量,我们知道局部变量只在声明它们的区域是可见的,在该范围外是无法访问的,对于那些需要更多访问的控制,VB.Net提供了更丰富的修饰关键字。
可访问性修饰
描述
Public
声明元素为公共的,对公共元素的可访问性没有限制。
Private
声明元素仅可以从同一模块、类或结构内访问。
Protected
声明元素仅可以从同一个类内,或该类的派生类中访问。
Friend
声明元素可以从同一个项目内访问,但不能从项目外部访问。
Protected Friend
声明元素可以从派生类或同一项目内或二者进行访问。
可访问性举例(注意TestB,TestC和TestA的关系)
以下是引用片段:
Public Class TestA
Public i As Int32 = 100 '访问无限制
Private s As String = "Hello" '只有TestA可以访问
Protected b As Boolean = True '只有TestA和它的派生类可以访问
Friend d As Double = 3.1415926 '只有同项目类可以访问
Protected Friend l As Long = 100000 '
End Class
Public Class TestB
Inherits TestA'继承TestA
Public Sub New()
MyBase.b = False
MyBase.d = 3.14
MyBase.i = 10
MyBase.l = 10000
End Sub
End Class
Public Class TestC
Public Sub New()
Dim a As New TestA
a.d = 3.14
a.i = 10
a.l = 1000
End Sub
End Class
怎么样,是不是很简单啊,如果你有VB6的基础的话,相信很快就能过渡到VB.net。
VB.Net实现文件合并的实例
关 键 词:
Private Sub MergeFiles(ByVal inputDir As String, ByVal inputMask As String, ByVal outputPath As String)
'store files in datatable with their created times to sort by later
Dim files As New DataTable
files.Columns.Add("filepath", GetType(String))
files.Columns.Add("creationtime", GetType(Date))
'find partial files
For Each f As String In IO.Directory.GetFiles(inputDir, inputMask)
files.Rows.Add(New Object() {f, IO.File.GetCreationTime(f)})
Next
'make sure output file does not exist before writing
If IO.File.Exists(outputPath) Then
IO.File.Delete(outputPath)
End If
'loop through file in order, and append contents to output file
For Each dr As DataRow In files.Select("", "creationtime")
Dim contents As String = My.Computer.FileSystem.ReadAllText(CStr(dr("filepath")))
My.Computer.FileSystem.WriteAllText(outputPath, contents, True)
Next
End Su
Private Sub MergeFiles(ByVal inputDir As String, ByVal inputMask As String, ByVal outputPath As String)
'store files in datatable with their created times to sort by later
Dim files As New DataTable
files.Columns.Add("filepath", GetType(String))
files.Columns.Add("creationtime", GetType(Date))
'find partial files
For Each f As String In IO.Directory.GetFiles(inputDir, inputMask)
files.Rows.Add(New Object() {f, IO.File.GetCreationTime(f)})
Next
'make sure output file does not exist before writing
If IO.File.Exists(outputPath) Then
IO.File.Delete(outputPath)
End If
'loop through file in order, and append contents to output file
For Each dr As DataRow In files.Select("", "creationtime")
Dim contents As String = My.Computer.FileSystem.ReadAllText(CStr(dr("filepath")))
My.Computer.FileSystem.WriteAllText(outputPath, contents, True)
Next
End Su
VB.NET 入门教程
Microsoft Corporation
适用于:
Microsoft Visual Basic.NET
摘要:《Visual Basic .NET 入门指南》介绍了 Visual Basic 语言的几种新功能,从而能充分利用 .NET 平台。下面的示例应用程序示范了如何构建一个实现 QuickSort 算法的简单 Visual Basic .NET 项目来。
下载 Quicksort_Visual_Basic_.NET.exe。
简介
Visual Basic .NET 将许多新的功能引入 Visual Basic 语言,使之能够充分利用 .NET 平台。以前版本的程序员将需要稍作调整才能转到 .NET 版本上。
下面的示例应用程序示范了如何构建一个实现 QuickSort 算法的简单 Visual Basic .NET 项目来。它包括了 Visual Basic .NET 程序的基本组成部分:读/写控制台和文件、创建函数和使用基本数组。
这些入门指南并不打算涵盖该编程语言的所有方面。它们只是您探索这种语言的一个起点。我们鼓励您按照本教程的说明执行,因为它包括了 QuickSort 应用程序的各个不同部分。您还可以获得完整的源代码和项目文件。
建议的要求
编译此示例应用程序需要 Visual Studio.NET(测试版 2 或更高版本)。关于 Visual Basic 的知识是有帮助的但不是必需的。
步骤 1. 开始项目
Visual Studio 中的开发工作以解决方案的形式进行组织,每个解决方案包含一个或多个项目。在本教程中,我们创建的解决方案包含一个 Visual Basic 项目。

Visual Basic 解决方案
Visual Studio .NET 已经创建了含有一个简单 Visual Basic 项目的解决方案。该项目包含两个文件:assemblyinfo.vb 和 module1.vb。
接下来的几个步骤将讨论这些不同的文件以及如何编译该项目。
步骤 2. Hello, World!
很遗憾,但我们仍然无法抵御这种诱惑……我们还是不得不完成一个经典的"Hello, World!"应用程序,这个应用程序最初是用 C 语言编写的。
修改源代码
1.
在 Solution Explorer 中双击文件"module1.vb"。可以通过 View 菜单来显示 Solution Explorer。
2.
更改预生成的模板 (module1.vb),如下面以斜体突出显示的 代码所示。
' Import namespaces
Imports System
Module Module1
Sub Main()
Console.WriteLine ("Hello, VISUAL BASIC .NET World!")
End Sub
End Module
3.
注意,当您键入代码时,Visual Studio 将为您提示类和函数的名称(因为 .NET 框架发布了这种类型信息)。

理解更改
System.Console 类的 WriteLine() 函数打印传递给它的字符串,其后紧跟一行新的字符。此函数可以接受许多其他数据类型(包括整型和浮点型)的参数。
在程序加载完成后,控制就传递给 Main() 函数。这就是我们在该过程中插入对 WriteLine() 的调用的原因。
步骤 3. 程序结构
既然我们已经构建了一个简单的 Hello World 应用程序,那么就让我们停下来分析一下 Visual Basic .NET 应用程序的基本组成部分。
源代码注释
单引号 ' 将行的剩余部分标记为一个注释,这样 Visual Basic .NET 编译器就会忽略它。
' This line is ignored by the compiler.' This line is also ignored by Visual Basic .NET compiler.
Imports 指令
.NET 框架为开发人员提供了许多有用的类。例如,Console 类处理对控制台窗口的输入和输出。这些类是按照层次树的形式组织的。Console 类的全限定名实际上是 System.Console。其他的类包括 System.IO.FileStream 和 System.Collections.Queue。
Imports 指令允许您在不使用全限定名的情况下引用命名空间中的类。以斜体突出显示的 代码应用了 Imports 指令。
Imports System
Module Module1
Sub Main()
System.Console.WriteLine("Hello, Visual Basic .NET World!")
Console.WriteLine("Hello, Visual Basic .NET World!")
End Sub
End Module
模块定义
在 Visual Basic 中,所有的函数都必须封装在类或模块中。一个类可以有多个实例(带有成员变量和函数)。然而,模块只包含函数,并且不能进行实例化。就 Hello World 应用程序来说,Module1 模块包含一个函数,即 Main() 函数。
在本入门指南中,我们并不打算深入地介绍类或模块,但是我们将为您简要概述为什么它们是我们示例应用程序的一部分。
Main() 函数
在应用程序加载到内存之后,Main() 过程就会接收控制,因此,应该将应用程序启动代码放在此函数中。
步骤 4. 控制台输入
现在,我们将继续编写 QuickSort 应用程序。我们需要做的第一件事就是提示用户提供输入和输出文件。
修改源代码
更改 Visual Basic 源文件 (module1.vb),如下面以斜体突出显示的代码所示。其他的差异(如类名)可忽略不计。
' Import namespaces
Imports System
Module Module1
Sub Main()
' Describe program function
Console.WriteLine ("QuickSort VISUAL BASIC .NET Sample Application")
Console.WriteLine ()
' Prompt user for filenames
Dim szSrcFile, szDestFile As String
Console.Write("Source: ")
szSrcFile = Console.ReadLine()
Console.Write("Output: ")
szDestFile = Console.ReadLine()
End Sub
End Module
从控制台进行读取
Console 类的 ReadLine() 方法提示用户输入,并返回输入的字符串。它会自动地为字符串处理内存分配,由于使用了 .NET 垃圾回收器,您不需要做任何释放内存的工作。
程序输出
从菜单中选择 Debug | Start Without Debugging 来运行程序。这是到此为止来自 QuickSort 应用程序的输出的屏幕截图。
步骤 5. 使用数组
在对从输入读取的行进行排序之前,程序需要将其存储到一个数组中。我们将简要讨论可实现对象数组的 .NET 基类的用法。
修改源代码
更改 Visual Basic 源文件 (module1.vb),如下面以斜体突出显示的代码所示。其他的差异(如类名)可忽略不计。
' Import namespaces
Imports System
Imports System.Collections
Module Module1
Sub Main()
' Describe program function
Console.WriteLine ("QuickSort Visual Basic .NET Sample Application")
Console.WriteLine ()
' Prompt user for filenames
Dim szSrcFile, szDestFile As String
Console.Write("Source: ")
szSrcFile = Console.ReadLine()
Console.Write("Output: ")
szDestFile = Console.ReadLine()
' TODO: Read contents of source file
Dim szContents As ArrayList
szContents = New ArrayList()
End Sub
End Module
使用 ArrayList 类
我们将导入 System.Collections 命名空间,这样我们就可以直接引用 ArrayList。此类实现大小可动态调整的对象数组。要插入新的元素,可以简单地将对象传递到 ArrayList 类的 Add() 方法。新的数组元素将引用原始的对象,而垃圾回收器将处理它的释放。
Dim szElement As String
Dim szArray As New ArrayList ()
szElement = "insert-me"
szArray.Add (szElement)
要检索现有的元素,请将所需元素的索引传递给 Item() 方法。另外,作为一种简写形式,还可以使用圆括号 operator (),它实际上映射到 Item() 方法。
Console.WriteLine (szArray(2))Console.WriteLine (szArray.Item (2))
ArrayList 类中还有许多其他方法,但是插入和检索都是我们需要在此示例中使用的。请查阅 MSDN 库以获得完整的参考指南。
适用于:
Microsoft Visual Basic.NET
摘要:《Visual Basic .NET 入门指南》介绍了 Visual Basic 语言的几种新功能,从而能充分利用 .NET 平台。下面的示例应用程序示范了如何构建一个实现 QuickSort 算法的简单 Visual Basic .NET 项目来。
下载 Quicksort_Visual_Basic_.NET.exe。
简介
Visual Basic .NET 将许多新的功能引入 Visual Basic 语言,使之能够充分利用 .NET 平台。以前版本的程序员将需要稍作调整才能转到 .NET 版本上。
下面的示例应用程序示范了如何构建一个实现 QuickSort 算法的简单 Visual Basic .NET 项目来。它包括了 Visual Basic .NET 程序的基本组成部分:读/写控制台和文件、创建函数和使用基本数组。
这些入门指南并不打算涵盖该编程语言的所有方面。它们只是您探索这种语言的一个起点。我们鼓励您按照本教程的说明执行,因为它包括了 QuickSort 应用程序的各个不同部分。您还可以获得完整的源代码和项目文件。
建议的要求
编译此示例应用程序需要 Visual Studio.NET(测试版 2 或更高版本)。关于 Visual Basic 的知识是有帮助的但不是必需的。
步骤 1. 开始项目
Visual Studio 中的开发工作以解决方案的形式进行组织,每个解决方案包含一个或多个项目。在本教程中,我们创建的解决方案包含一个 Visual Basic 项目。

Visual Basic 解决方案
Visual Studio .NET 已经创建了含有一个简单 Visual Basic 项目的解决方案。该项目包含两个文件:assemblyinfo.vb 和 module1.vb。
接下来的几个步骤将讨论这些不同的文件以及如何编译该项目。
步骤 2. Hello, World!
很遗憾,但我们仍然无法抵御这种诱惑……我们还是不得不完成一个经典的"Hello, World!"应用程序,这个应用程序最初是用 C 语言编写的。
修改源代码
1.
在 Solution Explorer 中双击文件"module1.vb"。可以通过 View 菜单来显示 Solution Explorer。
2.
更改预生成的模板 (module1.vb),如下面以斜体突出显示的 代码所示。
' Import namespaces
Imports System
Module Module1
Sub Main()
Console.WriteLine ("Hello, VISUAL BASIC .NET World!")
End Sub
End Module
3.
注意,当您键入代码时,Visual Studio 将为您提示类和函数的名称(因为 .NET 框架发布了这种类型信息)。

理解更改
System.Console 类的 WriteLine() 函数打印传递给它的字符串,其后紧跟一行新的字符。此函数可以接受许多其他数据类型(包括整型和浮点型)的参数。
在程序加载完成后,控制就传递给 Main() 函数。这就是我们在该过程中插入对 WriteLine() 的调用的原因。
步骤 3. 程序结构
既然我们已经构建了一个简单的 Hello World 应用程序,那么就让我们停下来分析一下 Visual Basic .NET 应用程序的基本组成部分。
源代码注释
单引号 ' 将行的剩余部分标记为一个注释,这样 Visual Basic .NET 编译器就会忽略它。
' This line is ignored by the compiler.' This line is also ignored by Visual Basic .NET compiler.
Imports 指令
.NET 框架为开发人员提供了许多有用的类。例如,Console 类处理对控制台窗口的输入和输出。这些类是按照层次树的形式组织的。Console 类的全限定名实际上是 System.Console。其他的类包括 System.IO.FileStream 和 System.Collections.Queue。
Imports 指令允许您在不使用全限定名的情况下引用命名空间中的类。以斜体突出显示的 代码应用了 Imports 指令。
Imports System
Module Module1
Sub Main()
System.Console.WriteLine("Hello, Visual Basic .NET World!")
Console.WriteLine("Hello, Visual Basic .NET World!")
End Sub
End Module
模块定义
在 Visual Basic 中,所有的函数都必须封装在类或模块中。一个类可以有多个实例(带有成员变量和函数)。然而,模块只包含函数,并且不能进行实例化。就 Hello World 应用程序来说,Module1 模块包含一个函数,即 Main() 函数。
在本入门指南中,我们并不打算深入地介绍类或模块,但是我们将为您简要概述为什么它们是我们示例应用程序的一部分。
Main() 函数
在应用程序加载到内存之后,Main() 过程就会接收控制,因此,应该将应用程序启动代码放在此函数中。
步骤 4. 控制台输入
现在,我们将继续编写 QuickSort 应用程序。我们需要做的第一件事就是提示用户提供输入和输出文件。
修改源代码
更改 Visual Basic 源文件 (module1.vb),如下面以斜体突出显示的代码所示。其他的差异(如类名)可忽略不计。
' Import namespaces
Imports System
Module Module1
Sub Main()
' Describe program function
Console.WriteLine ("QuickSort VISUAL BASIC .NET Sample Application")
Console.WriteLine ()
' Prompt user for filenames
Dim szSrcFile, szDestFile As String
Console.Write("Source: ")
szSrcFile = Console.ReadLine()
Console.Write("Output: ")
szDestFile = Console.ReadLine()
End Sub
End Module
从控制台进行读取
Console 类的 ReadLine() 方法提示用户输入,并返回输入的字符串。它会自动地为字符串处理内存分配,由于使用了 .NET 垃圾回收器,您不需要做任何释放内存的工作。
程序输出
从菜单中选择 Debug | Start Without Debugging 来运行程序。这是到此为止来自 QuickSort 应用程序的输出的屏幕截图。
步骤 5. 使用数组
在对从输入读取的行进行排序之前,程序需要将其存储到一个数组中。我们将简要讨论可实现对象数组的 .NET 基类的用法。
修改源代码
更改 Visual Basic 源文件 (module1.vb),如下面以斜体突出显示的代码所示。其他的差异(如类名)可忽略不计。
' Import namespaces
Imports System
Imports System.Collections
Module Module1
Sub Main()
' Describe program function
Console.WriteLine ("QuickSort Visual Basic .NET Sample Application")
Console.WriteLine ()
' Prompt user for filenames
Dim szSrcFile, szDestFile As String
Console.Write("Source: ")
szSrcFile = Console.ReadLine()
Console.Write("Output: ")
szDestFile = Console.ReadLine()
' TODO: Read contents of source file
Dim szContents As ArrayList
szContents = New ArrayList()
End Sub
End Module
使用 ArrayList 类
我们将导入 System.Collections 命名空间,这样我们就可以直接引用 ArrayList。此类实现大小可动态调整的对象数组。要插入新的元素,可以简单地将对象传递到 ArrayList 类的 Add() 方法。新的数组元素将引用原始的对象,而垃圾回收器将处理它的释放。
Dim szElement As String
Dim szArray As New ArrayList ()
szElement = "insert-me"
szArray.Add (szElement)
要检索现有的元素,请将所需元素的索引传递给 Item() 方法。另外,作为一种简写形式,还可以使用圆括号 operator (),它实际上映射到 Item() 方法。
Console.WriteLine (szArray(2))Console.WriteLine (szArray.Item (2))
ArrayList 类中还有许多其他方法,但是插入和检索都是我们需要在此示例中使用的。请查阅 MSDN 库以获得完整的参考指南。
2008年12月15日星期一
讲解VB.Net(八) 常用语法
关 键 词: vb.net .NET
走近VB.NET(八) 常用语法
一:Try………Catch………finally………end try 捕获错误
把一个可能出错的语句放在try后面,如果出错,执行catch语句,
catch可以有多个,第一个catch不能捕获的错误,将被下一个catch语句所捕获。在所有的处理结束后,执行finally语句。
在一个try………end try 过程中可以使用catch与finally两个中的一个,或者两个一起用,
二:Protected, private, Public 封装控制
这三个关键字一般放在语句最前面,而会置于overloads与Overrides的后面
public是工程级别外部访问
protected是本族级别以下内部访问
private是不提供非本地访问
三:ByVal sender As Object, ByVal e As System.EventArgs 这是最赏用事件传递参数。被封装于两个对象内,如果你要传递相应的参数,要在这两个对象里面找,如当前鼠标位置为e.X e.Y。在VB.Net中有些事件是要自已动手写的,如窗体鼠标过程,一般加上这个参数在后面的括号内就解决了。
四:重载语法Overloads
如:class class1
public strtem as string
overloads public sub subx()重载subx(A状态)
strtem=”3”
end sub
overloads public sub subx(x as string) 重载subx(B状态)
strtem=x
end sub
end class
如果你如果调用subx()中间没有参数,则VB自动调用重载subx(A状态),
overloads public sub subx()重载subx(A状态)
strtem=”3”
end sub
结果就是strtem=”3”
如果你这样调用,subx(“这是一个不同的结果”),则VB自动调用重载subx(B状态)
overloads public sub subx(x as string) 重载subx(B状态)
strtem=x
end sub
结果就是 strtem=“这是一个不同的结果”
您可以在函数中调用,包括在API中(当然VB.Net不再使用winAPI).
甚至一些至关紧要的过程也不例外:如new过程(此方法王国荣文章中有介绍)
如: class class1
Overloads Public Sub New()
。。。。。。
。。。。。。
end sub
Overloads Public Sub New(s as string)
。。。。。。
。。。。。。
end sub
end class
同样有两种调用的方法,如dim as as class1=new class 调用前面一个无参数的new过程,
而dim asb as class1=new class(“string”)调用第二个new 过程.
切记,如果一个过程或一个函数只有一种状态,不能这样运用。如果您试图使用overloads关键字,则VB.Net会出现错误的提示要求你移去overloads
五:Overrides改写
如常见的dispose过程:
Overrides Public Sub Dispose()
MyBase.Dispose
components.Dispose
End Sub
Overrides表示完全的改写父类提供的过程与函数
不过要记住使用改写的前提是在父类的同一过程或函数的前面也使用了overrides关键字
六:mybase.new 与mybase.dispose
ublic Sub New()
MyBase.New
Form1 = Me
InitializeComponent
End Sub
Overrides Public Sub Dispose() ''''''''
MyBase.Dispose
components.Dispose
End Sub
这两个过程是任何一个新建工程都会有的,mybase.new是调用当前类的父类的new过程,同样你也可以加上参数配合父类的重载New过程。如:
Overloads Public Sub New ()
MyBase.New()
End Sub
Overloads Public Sub New (string)
MyBase.New(string)
End Sub
七:Structure构造
自定义类型,如:
Structure Type1
Dim x as y
Dim a as b
。。。。。。。
end structure
这个取代VB6中的使用type………end type方式自定义类型的方法。
八:return返回值 function functionname() return X。。。。。。 end funtion 他的作用与下面一样:
function functionname() functionname = X。。。。。。 end funtion
走近VB.NET(八) 常用语法
一:Try………Catch………finally………end try 捕获错误
把一个可能出错的语句放在try后面,如果出错,执行catch语句,
catch可以有多个,第一个catch不能捕获的错误,将被下一个catch语句所捕获。在所有的处理结束后,执行finally语句。
在一个try………end try 过程中可以使用catch与finally两个中的一个,或者两个一起用,
二:Protected, private, Public 封装控制
这三个关键字一般放在语句最前面,而会置于overloads与Overrides的后面
public是工程级别外部访问
protected是本族级别以下内部访问
private是不提供非本地访问
三:ByVal sender As Object, ByVal e As System.EventArgs 这是最赏用事件传递参数。被封装于两个对象内,如果你要传递相应的参数,要在这两个对象里面找,如当前鼠标位置为e.X e.Y。在VB.Net中有些事件是要自已动手写的,如窗体鼠标过程,一般加上这个参数在后面的括号内就解决了。
四:重载语法Overloads
如:class class1
public strtem as string
overloads public sub subx()重载subx(A状态)
strtem=”3”
end sub
overloads public sub subx(x as string) 重载subx(B状态)
strtem=x
end sub
end class
如果你如果调用subx()中间没有参数,则VB自动调用重载subx(A状态),
overloads public sub subx()重载subx(A状态)
strtem=”3”
end sub
结果就是strtem=”3”
如果你这样调用,subx(“这是一个不同的结果”),则VB自动调用重载subx(B状态)
overloads public sub subx(x as string) 重载subx(B状态)
strtem=x
end sub
结果就是 strtem=“这是一个不同的结果”
您可以在函数中调用,包括在API中(当然VB.Net不再使用winAPI).
甚至一些至关紧要的过程也不例外:如new过程(此方法王国荣文章中有介绍)
如: class class1
Overloads Public Sub New()
。。。。。。
。。。。。。
end sub
Overloads Public Sub New(s as string)
。。。。。。
。。。。。。
end sub
end class
同样有两种调用的方法,如dim as as class1=new class 调用前面一个无参数的new过程,
而dim asb as class1=new class(“string”)调用第二个new 过程.
切记,如果一个过程或一个函数只有一种状态,不能这样运用。如果您试图使用overloads关键字,则VB.Net会出现错误的提示要求你移去overloads
五:Overrides改写
如常见的dispose过程:
Overrides Public Sub Dispose()
MyBase.Dispose
components.Dispose
End Sub
Overrides表示完全的改写父类提供的过程与函数
不过要记住使用改写的前提是在父类的同一过程或函数的前面也使用了overrides关键字
六:mybase.new 与mybase.dispose
ublic Sub New()
MyBase.New
Form1 = Me
InitializeComponent
End Sub
Overrides Public Sub Dispose() ''''''''
MyBase.Dispose
components.Dispose
End Sub
这两个过程是任何一个新建工程都会有的,mybase.new是调用当前类的父类的new过程,同样你也可以加上参数配合父类的重载New过程。如:
Overloads Public Sub New ()
MyBase.New()
End Sub
Overloads Public Sub New (string)
MyBase.New(string)
End Sub
七:Structure构造
自定义类型,如:
Structure Type1
Dim x as y
Dim a as b
。。。。。。。
end structure
这个取代VB6中的使用type………end type方式自定义类型的方法。
八:return返回值 function functionname() return X。。。。。。 end funtion 他的作用与下面一样:
function functionname() functionname = X。。。。。。 end funtion
在vb中实现超连接的方法!和直接发邮件
新闻简介:新建立一个模块
然后再其中添加如下代码 :
Option Explicit
Public Const email = "support@online.com"
Public Const URL = "http://blog.csdn.net/flm2003/"
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal
关 键 词:
新建立一个模块
然后再其中添加如下代码 :
Option Explicit
Public Const email = "support@online.com"
Public Const URL = "http://blog.csdn.net/flm2003/"
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_SHOWNORMAL = 1
Public Sub gotoweb()
Dim Success As Long
Success = ShellExecute(0&, vbNullString, URL, vbNullString, "C:\", SW_SHOWNORMAL)
End Sub
Public Sub sendemail()
Dim Success As Long
Success = ShellExecute(0&, vbNullString, "mailto:" & email, vbNullString, "C:\", SW_SHOWNORMAL)
End Sub
接着就简单不过了!
在你所要进行超连接的窗体中,如实现LABEL的超连接
那就在LABEL的CLICK事件中加入 gotoweb或sendemail 即可!
然后再其中添加如下代码 :
Option Explicit
Public Const email = "support@online.com"
Public Const URL = "http://blog.csdn.net/flm2003/"
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal
关 键 词:
新建立一个模块
然后再其中添加如下代码 :
Option Explicit
Public Const email = "support@online.com"
Public Const URL = "http://blog.csdn.net/flm2003/"
Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Public Const SW_SHOWNORMAL = 1
Public Sub gotoweb()
Dim Success As Long
Success = ShellExecute(0&, vbNullString, URL, vbNullString, "C:\", SW_SHOWNORMAL)
End Sub
Public Sub sendemail()
Dim Success As Long
Success = ShellExecute(0&, vbNullString, "mailto:" & email, vbNullString, "C:\", SW_SHOWNORMAL)
End Sub
接着就简单不过了!
在你所要进行超连接的窗体中,如实现LABEL的超连接
那就在LABEL的CLICK事件中加入 gotoweb或sendemail 即可!
VB.NET中的TextBox控件详解
新闻简介: TextBox组件(文本框组件)是一种常用的,也是比较容易掌握的组件。应用程序主要使用它来接收使用者于输入文字信息。在前面内容中已经或多或少的接触到TextBox组件。本节就来详细探讨一下Visual Basic .Net中TextBox组件的使用方法。
一.TextBox组件、TextBox类:
当我们使用Visual Basic .Net集成开发环境开发应用程序时,在从【工具箱】的【Windows窗体】选项卡中向Form1的设计窗体拖入一个TextBox组件的后,我们可能并没有感觉到即使时这样一个简单的操作,Visual Basic .Net都做了很多幕后工作。主要工作和
关 键 词: vb.net 控件 .NET
TextBox组件(文本框组件)是一种常用的,也是比较容易掌握的组件。应用程序主要使用它来接收使用者于输入文字信息。在前面内容中已经或多或少的接触到TextBox组件。本节就来详细探讨一下Visual Basic .Net中TextBox组件的使用方法。
一.TextBox组件、TextBox类:
当我们使用Visual Basic .Net集成开发环境开发应用程序时,在从【工具箱】的【Windows窗体】选项卡中向Form1的设计窗体拖入一个TextBox组件的后,我们可能并没有感觉到即使时这样一个简单的操作,Visual Basic .Net都做了很多幕后工作。主要工作和步骤如下:
1. 首先实例化System.Windows.Forms.TextBox类,并根据拖动到窗体的位置和形状分别设定TextBox实例的各个属性。
2. 我们看到的设计窗体,其实是Form1类的一个实例,而Form1类首先是从System.Windows.Forms.Form类继承而来,Form1类中的成员根据使用者往窗体中拖入的组件不同而不同。各个成员通过Add或AddRange方法加入到Form1中,这样拖入的组件才能够显示在设计窗体上。
以上这些都完全不同于以前Visual Basic。通过上述步骤, 我们不难得到TextBox组件和TextBox类之间的关系,TextBox组件是命名空间System.Windows.Forms中的TextBox类的实例,在从【工具箱】的【Windows窗体】选项卡中拖入窗体的任一组件,都是.Net框架类库——.Net FrameWork SDK中封装的某一个类的实例。通过上述步骤也不难看出,Visual Basic .Net的确才是真正的面向对象(OOP)的开发语言。
二.TextBox类的成员:
TextBox组件使用虽然比较简单,但TextBox类的构成成员却是非常的丰富。在一般性的编程中,主要涉及到三类:属性、方法和事件。表01、表02和表03分别是TextBox类的常用属性、方法和事件及其简单说明。
属性 说明
AcceptsReturn 指示在多行TextBox组件中按ENTER键时,是在组件中创建一行新文本还是激活窗体的默认按钮。
AcceptsTab 该值指示在多行文本框组件中按TAB键时,是否在组件中键入一个TAB字符,而不是按选项卡的顺序将焦点移动到下一个组件。
AllowDrop 获取或设置一个值,该值指示组件是否可以接受用户拖放到它上面的数据。
Anchor 获取或设置组件的哪些边缘锚定到其容器边缘。
BackColor 获取或设置组件的背景色。
BackgroundImage 获取或设置在组件中显示的背景图像。
BorderStyle 获取或设置文本框组件的边框类型。
Bottom 获取组件的下边缘与其容器的工作区的上边缘之间的距离。
CanFocus 获取一个值,该值指示组件是否可以接收焦点。
CanSelect 获取一个值,该值指示是否可以选中组件。
CanUndo 获取一个值,该值指示用户在文本框组件中能否撤消前一操作。
CharacterCasing 获取或设置TextBox组件是否在字符键入时修改其大小写格式。
ContextMenu 获取或设置与组件关联的快捷菜单。
Reated 获取一个值,该值指示组件是否已经创建。
Cursor 获取或设置当鼠标指针位于组件上时显示的光标。
DataBindings 为该组件获取数据绑定。
Dock 获取或设置组件停靠到父容器的哪一个边缘。
Enabled 获取或设置一个值,该值指示组件是否可以对用户交互作出响应。
Focused 获取一个值,该值指示组件是否有输入焦点。
Font 获取或设置组件显示的文字的字体。
ForeColor 获取或设置组件的前景色。
MaxLength 获取或设置用户可以在文本框组件中最多键入的字符数。
Multiline TRUE/FALSE,该值指示它是否为多行文本框组件。
PasswordChar 获取或设置字符,该字符用于屏蔽单行
ScrollBars 获取或设置哪些滚动条应出现在多行TextBox 组件中。
Text 获取或设置文本框中的当前文本。
TextAlign 设置文本框内文本得对齐方式
TextLength 获取组件中文本的长度。
表01:TextBox类的常用属性及其说明
方法 说明
AppendText 向文本框的当前文本追加文本。
Clear 从文本框控件中清除所有文本。
ClearUndo 从该文本框的撤消缓冲区中清除关于最近操作的信息。
Copy 将文本框中的当前选定内容复制到剪贴板。
Cut 将文本框中的当前选定内容移动到剪贴板中。
DoDragDrop 开始拖放操作。
Focus 为控件设置输入焦点。
GetChildAtPoint 检索位于指定坐标处的子控件。
GetNextControl 按照子控件的Tab键顺序向前或向后检索下一个控件。
Hide 对用户隐藏控件。
Paste 用剪贴板的内容替换文本框中的当前选定内容。
PointToClient 将指定屏幕点的位置计算成工作区坐标。
PointToScreen 将指定工作区点的位置计算成屏幕坐标。
ResetBindings 将DataBindings属性重置为其默认值。
Select 选择控件中的文本。
SelectAll 选定文本框中的所有文本。
SelectNextControl 激活下一个控件。
Show 向用户显示控件。
SuspendLayout 临时挂起控件的布局逻辑。
Undo 撤消文本框中的上一个编辑操作。
表02:TextBox类的常用方法及其说明
事件 说明
Click 在单击文本框时发生。
CursorChanged 当 Cursor 属性的值更改时发生。
DoubleClick 在双击控件时发生。
DragDrop 在完成拖放操作时发生。
DragEnter 在将对象拖入控件的边界时发生。
DragLeave 在将对象拖出控件的边界时发生。
DragOver 在将对象拖到控件的边界上发生。
EnabledChanged Enabled 属性值更改后发生。
Enter 进入控件时发生。
GiveFeedback 在执行拖动操作期间发生。
GotFocus 在控件接收焦点时发生。
KeyDown 在控件有焦点的情况下按下键时发生。
KeyPress 在控件有焦点的情况下按下键时发生。
KeyUp 在控件有焦点的情况下释放键时发生。
Leave 在输入焦点离开控件时发生。
LostFocus 当控件失去焦点时发生。
MouseDown 当鼠标指针位于控件上并按下鼠标键时发生。
MouseEnter 在鼠标指针进入控件时发生。
MouseHover 在鼠标指针悬停在控件上时发生。
MouseLeave 在鼠标指针离开控件时发生。
MouseMove 在鼠标指针移到控件上时发生。
MouseUp 在鼠标指针在控件上并释放鼠标键时发生。
MouseWheel 在移动鼠标轮并且控件有焦点时发生。
Move 在移动控件时发生。
Paint 在重绘控件时发生。
Resize 在调整控件大小时发生。
03:TextBox类的常用事件及其说明
当然TextBox类除了上述的属性、方法和事件,还有很多属性、方法和事件,和很多受保护的方法和受保护的属性,由于它们使用的几率较少和篇幅所限,就不能一一介绍了,感兴趣的朋友可以参阅相关资料。
三.掌握TextBox组件的基本用法:
由于TextBox类的成员实在太丰富,一个示例要想介绍上述所有的方法、属性和事件是不可能。在下面介绍的示例中,将突出介绍在Visual Basic .Net集成开发环境下通过对设定不同的属性值实现三种常见的TextBox组件式样,以及TextBox组件的方法的调用方法和在Visual Basic .Net集成开发环境中如何加入TextBox组件不同事件对应的处理代码。让各位更加熟悉TextBox类和Visual Basic.Net开发环境。
下面是TextBox示例的具体实现步骤:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual Basic项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【TextBox组件】。
6. 在【位置】的文本框中输入【E:\VS.NET项目】,然后单击【确定】按钮,这样在“E:\VS.NET项目”目录中就产生了名称为“TextBox组件”的文件夹,并在里面创建了名称为“TextBox组件”的项目文件。
7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应操作:
三个Label组件。
三个TextBox组件,分别为TextBox1、TextBox2和TextBox3。
8. 按照表04中数值来设定设定组件的主要属性,请注意TextBox组件中的属性设定值:
表04:【TextBox组件】项目窗体中各组件的主要属性设定数值表
按照表04各值设定后的TextBox组件三种常用的式样也就产生了,具体如图01所示:
图01:程序设计时TextBox组件三种常见使用方法
这三种式样就是单行的TextBox组件、多行的TextBox组件和用以输入类似密码数据的TextBox组件。
9. 为TextBox1组件添加事件和事件的处理代码,此次添加的事件的名称是Leave,当TextBox1组件失去焦点时触发此事件。添加TextBox1组件的其他事件也可仿照下面的处理方法。下面是利用Visual Basic .Net在【TextBox组件】项目中添加TextBox1组件的Leave事件和添加Leave事件的处理代码的具体步骤:
首先把Visual Basic .Net的当前窗口切换到Form1.vb的代码编辑界面。然后在如图02所示的选择框中选择TextBox2:
图02:选择TextBox组件
之后,在图03所示的选择框中选择“Leave”:
图03:选取Leave事件
在选择“Leave”之后,Visual Basic .Net会自动在Form1.vb中产生TextBox1的Leave事件。
在Leave事件的事件处理代码区添加下列代码,下面代码调用了TextBox2组件的“Clear”方法并且显示一个TextBox1组件失去焦点的提示框:
TextBox2.Clear ( )
''清除TextBox2组件的显示内容
MsgBox ( "失去焦点!")
''弹出提示框
至此【TextBox组件】项目的全部工作就完成了,图04是程序编译后运行界面。
图04:【TextBox项目】的运行界面
四.总结:
虽然【TextBox组件】项目已经完成了,但是关于TextBox组件的话题远没有结束,通过表01、表02和表03以及那些没有列出的属性、方法和事件都无不表明,在Visual Basic .Net要精通一个在Visual Basic中非常基本的组件的使用方法都是很有难度的。本章虽然介绍的TextBox组件,其实对其他大多数组件也都具有参考价值,这些组件的常用属性、方法和事件的意义也大都和TextBox组件差不多。
一.TextBox组件、TextBox类:
当我们使用Visual Basic .Net集成开发环境开发应用程序时,在从【工具箱】的【Windows窗体】选项卡中向Form1的设计窗体拖入一个TextBox组件的后,我们可能并没有感觉到即使时这样一个简单的操作,Visual Basic .Net都做了很多幕后工作。主要工作和
关 键 词: vb.net 控件 .NET
TextBox组件(文本框组件)是一种常用的,也是比较容易掌握的组件。应用程序主要使用它来接收使用者于输入文字信息。在前面内容中已经或多或少的接触到TextBox组件。本节就来详细探讨一下Visual Basic .Net中TextBox组件的使用方法。
一.TextBox组件、TextBox类:
当我们使用Visual Basic .Net集成开发环境开发应用程序时,在从【工具箱】的【Windows窗体】选项卡中向Form1的设计窗体拖入一个TextBox组件的后,我们可能并没有感觉到即使时这样一个简单的操作,Visual Basic .Net都做了很多幕后工作。主要工作和步骤如下:
1. 首先实例化System.Windows.Forms.TextBox类,并根据拖动到窗体的位置和形状分别设定TextBox实例的各个属性。
2. 我们看到的设计窗体,其实是Form1类的一个实例,而Form1类首先是从System.Windows.Forms.Form类继承而来,Form1类中的成员根据使用者往窗体中拖入的组件不同而不同。各个成员通过Add或AddRange方法加入到Form1中,这样拖入的组件才能够显示在设计窗体上。
以上这些都完全不同于以前Visual Basic。通过上述步骤, 我们不难得到TextBox组件和TextBox类之间的关系,TextBox组件是命名空间System.Windows.Forms中的TextBox类的实例,在从【工具箱】的【Windows窗体】选项卡中拖入窗体的任一组件,都是.Net框架类库——.Net FrameWork SDK中封装的某一个类的实例。通过上述步骤也不难看出,Visual Basic .Net的确才是真正的面向对象(OOP)的开发语言。
二.TextBox类的成员:
TextBox组件使用虽然比较简单,但TextBox类的构成成员却是非常的丰富。在一般性的编程中,主要涉及到三类:属性、方法和事件。表01、表02和表03分别是TextBox类的常用属性、方法和事件及其简单说明。
属性 说明
AcceptsReturn 指示在多行TextBox组件中按ENTER键时,是在组件中创建一行新文本还是激活窗体的默认按钮。
AcceptsTab 该值指示在多行文本框组件中按TAB键时,是否在组件中键入一个TAB字符,而不是按选项卡的顺序将焦点移动到下一个组件。
AllowDrop 获取或设置一个值,该值指示组件是否可以接受用户拖放到它上面的数据。
Anchor 获取或设置组件的哪些边缘锚定到其容器边缘。
BackColor 获取或设置组件的背景色。
BackgroundImage 获取或设置在组件中显示的背景图像。
BorderStyle 获取或设置文本框组件的边框类型。
Bottom 获取组件的下边缘与其容器的工作区的上边缘之间的距离。
CanFocus 获取一个值,该值指示组件是否可以接收焦点。
CanSelect 获取一个值,该值指示是否可以选中组件。
CanUndo 获取一个值,该值指示用户在文本框组件中能否撤消前一操作。
CharacterCasing 获取或设置TextBox组件是否在字符键入时修改其大小写格式。
ContextMenu 获取或设置与组件关联的快捷菜单。
Reated 获取一个值,该值指示组件是否已经创建。
Cursor 获取或设置当鼠标指针位于组件上时显示的光标。
DataBindings 为该组件获取数据绑定。
Dock 获取或设置组件停靠到父容器的哪一个边缘。
Enabled 获取或设置一个值,该值指示组件是否可以对用户交互作出响应。
Focused 获取一个值,该值指示组件是否有输入焦点。
Font 获取或设置组件显示的文字的字体。
ForeColor 获取或设置组件的前景色。
MaxLength 获取或设置用户可以在文本框组件中最多键入的字符数。
Multiline TRUE/FALSE,该值指示它是否为多行文本框组件。
PasswordChar 获取或设置字符,该字符用于屏蔽单行
ScrollBars 获取或设置哪些滚动条应出现在多行TextBox 组件中。
Text 获取或设置文本框中的当前文本。
TextAlign 设置文本框内文本得对齐方式
TextLength 获取组件中文本的长度。
表01:TextBox类的常用属性及其说明
方法 说明
AppendText 向文本框的当前文本追加文本。
Clear 从文本框控件中清除所有文本。
ClearUndo 从该文本框的撤消缓冲区中清除关于最近操作的信息。
Copy 将文本框中的当前选定内容复制到剪贴板。
Cut 将文本框中的当前选定内容移动到剪贴板中。
DoDragDrop 开始拖放操作。
Focus 为控件设置输入焦点。
GetChildAtPoint 检索位于指定坐标处的子控件。
GetNextControl 按照子控件的Tab键顺序向前或向后检索下一个控件。
Hide 对用户隐藏控件。
Paste 用剪贴板的内容替换文本框中的当前选定内容。
PointToClient 将指定屏幕点的位置计算成工作区坐标。
PointToScreen 将指定工作区点的位置计算成屏幕坐标。
ResetBindings 将DataBindings属性重置为其默认值。
Select 选择控件中的文本。
SelectAll 选定文本框中的所有文本。
SelectNextControl 激活下一个控件。
Show 向用户显示控件。
SuspendLayout 临时挂起控件的布局逻辑。
Undo 撤消文本框中的上一个编辑操作。
表02:TextBox类的常用方法及其说明
事件 说明
Click 在单击文本框时发生。
CursorChanged 当 Cursor 属性的值更改时发生。
DoubleClick 在双击控件时发生。
DragDrop 在完成拖放操作时发生。
DragEnter 在将对象拖入控件的边界时发生。
DragLeave 在将对象拖出控件的边界时发生。
DragOver 在将对象拖到控件的边界上发生。
EnabledChanged Enabled 属性值更改后发生。
Enter 进入控件时发生。
GiveFeedback 在执行拖动操作期间发生。
GotFocus 在控件接收焦点时发生。
KeyDown 在控件有焦点的情况下按下键时发生。
KeyPress 在控件有焦点的情况下按下键时发生。
KeyUp 在控件有焦点的情况下释放键时发生。
Leave 在输入焦点离开控件时发生。
LostFocus 当控件失去焦点时发生。
MouseDown 当鼠标指针位于控件上并按下鼠标键时发生。
MouseEnter 在鼠标指针进入控件时发生。
MouseHover 在鼠标指针悬停在控件上时发生。
MouseLeave 在鼠标指针离开控件时发生。
MouseMove 在鼠标指针移到控件上时发生。
MouseUp 在鼠标指针在控件上并释放鼠标键时发生。
MouseWheel 在移动鼠标轮并且控件有焦点时发生。
Move 在移动控件时发生。
Paint 在重绘控件时发生。
Resize 在调整控件大小时发生。
03:TextBox类的常用事件及其说明
当然TextBox类除了上述的属性、方法和事件,还有很多属性、方法和事件,和很多受保护的方法和受保护的属性,由于它们使用的几率较少和篇幅所限,就不能一一介绍了,感兴趣的朋友可以参阅相关资料。
三.掌握TextBox组件的基本用法:
由于TextBox类的成员实在太丰富,一个示例要想介绍上述所有的方法、属性和事件是不可能。在下面介绍的示例中,将突出介绍在Visual Basic .Net集成开发环境下通过对设定不同的属性值实现三种常见的TextBox组件式样,以及TextBox组件的方法的调用方法和在Visual Basic .Net集成开发环境中如何加入TextBox组件不同事件对应的处理代码。让各位更加熟悉TextBox类和Visual Basic.Net开发环境。
下面是TextBox示例的具体实现步骤:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual Basic项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【TextBox组件】。
6. 在【位置】的文本框中输入【E:\VS.NET项目】,然后单击【确定】按钮,这样在“E:\VS.NET项目”目录中就产生了名称为“TextBox组件”的文件夹,并在里面创建了名称为“TextBox组件”的项目文件。
7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件,并执行相应操作:
三个Label组件。
三个TextBox组件,分别为TextBox1、TextBox2和TextBox3。
8. 按照表04中数值来设定设定组件的主要属性,请注意TextBox组件中的属性设定值:
表04:【TextBox组件】项目窗体中各组件的主要属性设定数值表
按照表04各值设定后的TextBox组件三种常用的式样也就产生了,具体如图01所示:
图01:程序设计时TextBox组件三种常见使用方法
这三种式样就是单行的TextBox组件、多行的TextBox组件和用以输入类似密码数据的TextBox组件。
9. 为TextBox1组件添加事件和事件的处理代码,此次添加的事件的名称是Leave,当TextBox1组件失去焦点时触发此事件。添加TextBox1组件的其他事件也可仿照下面的处理方法。下面是利用Visual Basic .Net在【TextBox组件】项目中添加TextBox1组件的Leave事件和添加Leave事件的处理代码的具体步骤:
首先把Visual Basic .Net的当前窗口切换到Form1.vb的代码编辑界面。然后在如图02所示的选择框中选择TextBox2:
图02:选择TextBox组件
之后,在图03所示的选择框中选择“Leave”:
图03:选取Leave事件
在选择“Leave”之后,Visual Basic .Net会自动在Form1.vb中产生TextBox1的Leave事件。
在Leave事件的事件处理代码区添加下列代码,下面代码调用了TextBox2组件的“Clear”方法并且显示一个TextBox1组件失去焦点的提示框:
TextBox2.Clear ( )
''清除TextBox2组件的显示内容
MsgBox ( "失去焦点!")
''弹出提示框
至此【TextBox组件】项目的全部工作就完成了,图04是程序编译后运行界面。
图04:【TextBox项目】的运行界面
四.总结:
虽然【TextBox组件】项目已经完成了,但是关于TextBox组件的话题远没有结束,通过表01、表02和表03以及那些没有列出的属性、方法和事件都无不表明,在Visual Basic .Net要精通一个在Visual Basic中非常基本的组件的使用方法都是很有难度的。本章虽然介绍的TextBox组件,其实对其他大多数组件也都具有参考价值,这些组件的常用属性、方法和事件的意义也大都和TextBox组件差不多。
Visual Basic 2005 简介,Visual Basic 2005
新闻简介:开发人员的工作效率是这一版 Microsoft Visual Studio 发布的目标。不管您使用何种应用程序类型或者选择何种语言,Microsoft 一直致力于构建集成开发环境 (IDE)、类库和语言套件,以使构建和部署应用程序尽可能地简单。
我们(本书的作者)很明显地看到,Microsoft 已经考察了编码的各个方面(包括代码编写本身、调试和部署),而且实际分析了如何才能使这些工作更有效率。这些增强功能影响深远,其中包括 Microsoft Visual Basic .NET 语言本身的改变、IDE 的改进、数据访问和显示的简化,还有一些改变提高了开发人员构造专业用户界面的工作效率,向框架中添加的众许多新类也减少了您编写的代码的数量,同时提高了部署的功能并扩大了部署
关 键 词: Visual Basic 2005 Visual Basic
本书的读者
本书为 Visual Basic 开发人员撰写。如果您是一名 Visual Basic 6 开发人员,您应该从第 1 章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”开始阅读,该章将带您快速进行 .NET Framework 开发。本书其余部分介绍 Visual Basic 的重要增强功能,这些增强功能可以提高开发应用程序的效率。
如果您已经是一名 .NET 开发人员,则可跳过第 1 章直接进入第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
本书的内容
本书包含八章。第一章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”对目前使用 Visual Basic 6 的开发人员最为有用。它介绍 .NET Framework 的开发。
本节对各章进行说明,并提供关于每个主题的介绍性信息。
重要事项要运行本书中的示例,需要安装两个软件:Visual Studio 2005 和 SQL Server 桌面、开发人员版、企业版或桌面引擎版。SQL Server 2000 的安装应该带有 Northwind 示例数据库。代码示例位于 MSDN 上的 http://msdn.microsoft.com/vbasic/VB6Migration。
返回页首
第 2 章,“Visual Basic 2005 的语言增强功能”
本章介绍泛型、My 对象和新的运算符。
泛型.NET Framework 最重要的增强功能可能就是引入了泛型。使用泛型可很轻松地创建特定于所存储的对象类型的集合。
Dim customerDictionaryAs New Dictionary(Of String, Customer)
customerDictionary.Add(currentCust.FullName, currentCust)
本例中,customerDictionary只能存储 Customer 类型的项。而且,查找结果明确是一个 String 值。因为该集合知道它所存储的对象类型(是 Customers 而不仅仅是“对象”),所以它可以提供完整的 Microsoft 智能感知,如下图所示。
图 I-1 泛型集合中的智能感知。
My Object Visual Basic .NET 的另一个重要增强功能就是简称为“My 对象”的功能。该功能提供对强大功能相当快速而简单的访问。例如,My.Application.Log.WriteEntry 可让您将信息写入一个文本文件、事件日志或者其他目标。My.Computer.Audio.PlaySystemSound 可以让您播放预定义的操作系统声音,而 My.Computer.Audio.Play 可以让您播放任何 .wav 文件。My 对象还为项目中的项提供默认实例。例如,您可以使用 My.Forms.MainForm.Show 来显示一个窗体而无需先创建其实例。
新运算符Visual Basic .NET 还包括很多新的关键字。IsNot 和 Nothing 一起使用可以使比较变得更加容易。过去,您通常必须编写 If Not X Is Nothing Then。现在,则这可以写成 If X IsNotNothing Then。Visual Basic .NET 还支持运算符重载、泛型,以及很多其他的高级编程功能。
有关这些增强功能的详细信息,请参阅第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
第 3 章,“Visual Studio 2005 集成开发环境”
Visual Basic 开发一直以来都与工作效率相关,而提供这种工作效率的关键工具就是 Visual Studio。使用 Visual Studio 2005,可以全面提升工作效率,可以更好、更容易地导航帮助内容,实现更简单的开发环境自定义以及更高效的编码和调试体验,其中包括“编辑并继续 (Edit-And-Continue)”的重新引入。
编码和调试增强功能当使用新的集成开发环境 (IDE) 时,您将看到为了在编码中加入“上下文”而做出的极大努力。即,在很多情况下,您不必导航到 IDE 中的其他窗口来获得需要的信息。在其他情况下,IDE 提供智能信息筛选功能,以便将最有可能的选择置于最突出的位置,并防止极少使用的选项干扰视图。在您第一次访问对象属性时可以看到该功能,如下图所示。
图 I-2 对象成员的渐进式显示。
您会发现,Visual Studio 2005 可以显示对象的所有成员,也可以通过筛选列表只显示最常用的成员,从而使您轻松找到所需的成员(例如,Connection 的 String 属性)。
Visual Studio 2005 还进一步扩展了常见的 Visual Basic 代码展开功能。您已经习惯了在起始处键入 Function 声明,然后让 IDE 自动插入 End Function。现在,这已经扩展到诸如属性声明这样的内容。键入 public property UserName as String并按 Enter 键可以自动插入下列代码:
Public Property UserName() As String
Get
End Get
Set(ByVal value As String)
End Set
End Property
Visual Studio 2005 还在调试时将各种信息置于您容易获得的位置,使您可以方便操作各种简单和复杂类型,而无需打开并浏览“Watch”窗口。下图显示如何直接在代码编辑器中显示一个复杂类型。
图 I-3 就地显示复杂类型的属性。
Visual Basic 6 提供的最大的工作效率增强功能之一就是“编辑并继续”。该功能曾经是调试过程中的主要手段,遗憾的是,以前 Visual Studio .NET 2002 或 2003 中没有包括该功能。现在“编辑并继续”又可以使用了,使您可以修复错误然后继续执行,而不用停止和重新启动。
IDE自定义和帮助系统增强功能Visual Basic 开发人员高度评价了自定义其开发环境,以及将窗口置于对他们最有利位置的功能。Visual Studio 一直都提供这种功能,但是在 Visual Studio 2005 中,该功能在几个关键部分进行了重大增强。首先,Visual Studio 2005 解决了“我不知道该窗口将停靠在何处”这一问题 — 当发生该问题时,虽然您认为已经将窗口进行了正确定位,但是当您放开它时,窗口或者没有停靠,或者没有按照您预期的方式停靠。在 Visual Studio 2005 中,停靠具有“停靠指导”,如下图所示。
图 I-4 使用停靠指导。
您只需将窗口放置到合适的箭头上就可以实现将其停靠在另一个窗口正上方、上方、右方、下方或者左方的功能。不用再猜测!还有,您的所有 IDE 自定义结果都可以导出和导入。
另外,帮助系统有了很大的改进,为您提供了更好的“F1”体验,而且可以让您访问最新的联机帮助。帮助系统甚至挂接到 Web 站点的“Code Wise”社区,它提供直接在 IDE 中访问 CodeGuru、Net247 和 ASP.NET 等站点的功能。
有关 Visual Studio 2005 提供的重要工作效率增强功能的详细信息,您可以直接参阅第 3 章“Visual Studio 2005 集成开发环境”。
返回页首
第 4 章,“构建以数据为中心的应用程序”
Visual Studio 2005 附带很多用于构建以数据为中心的应用程序的强大工具。首先,有一些构建于 ADO.NET 1.0 之上的新对象。这包括一个类型化 DataAdapter 类,它使得调用存储过程像调用函数一样容易。该工具箱还包含一个很容易进行自定义和控制的新网格控件。最后,IDE 包含一个新的“Data Sources”窗口,帮助您管理这些对象以及在设计时创建您的用户界面。
“Data Sources”窗口用于生成您将在整个给定应用程序中使用的类型化 DataAdapter 和类型 DataSet。一旦您连接到数据库并选择了要使用的表和过程,那么只需将对象从“Data Sources”窗口拖到设计图面来创建用户界面,如下图所示。
图 I-5 通过“Data Sources”窗口生成用户界面。
您可以看到,默认情况下,当 customers 表放置于设计图面时,后者使用新的GridView控件来呈现它。您也可以让它呈现为单个字段,而且可以确定用于每个字段的控件类型。
您还可以使用 DataSet 设计器将方法映射到存储过程。这使得调用存储过程像下面的代码一样简单:
ds = MyDataSet.GetByCustomerID(customerID)
有关在 Visual Studio 2005 中使用数据的详细信息,请参阅第 4 章“构建以数据为中心的应用程序”。
返回页首
第 5 章,“构造用户界面”
Visual Basic 开发人员在快速构建用户界面方面从未遇到任何困难。如果 Visual Basic 在某一方面始终出类拔萃,那就是工具箱和窗体设计器方面。但是,Visual Basic 开发人员一直不断地要求,“给我们提供 Microsoft 在其应用程序中所使用的用户界面控件”。更具体地说,开发人员需要很多用户界面元素,例如 Microsoft Office 等产品中的漂浮工具栏。
新控件您将高兴地了解到,此版本的 Visual Studio 不仅仅专注于有丰富素材的工具箱,它确实在努力地使构建专业水平的用户界面变得更容易,并且无需借助于第三方组件或进行大量的自定义控件开发。第 5 章分析的第一个控件是 ToolStrip,如下图所示。
图 I-6 MenuStrip、StatusStrip 和 ToolStrip。
您可以看到用两个 ToolStrip控件创建的一个简单窗体。这完全可以在几秒钟之内完成,但事实上还有一些内容需要讨论。首先,您可以看到 ToolStrip控件支持“漂浮”,即用户可在运行时拖动 Tool- Strip 控件并对其进行排列。其次,最上方的 ToolStrip包含您所熟悉的标准图标。这些图标均通过一次单击添加。如果有一些您不想要的图标,只需选中它们然后按 Delete 键即可。ToolStrip不仅仅支持按钮。它还包含文本框、下拉列表、标签,等等。最后,该工具栏与 Microsoft Office 的工具栏极为相似,使得可以轻松构建具有专业外观的应用程序,用户会很自然地懂得如何使用这些应用程序。
菜单栏和状态栏构建于 ToolStrip基础结构之上,使您的菜单栏或状态栏具有各种各样的控件和功能。
在工具箱中,您还会发现 ActiveX Web 浏览器控件的完整 .NET 包装,这使得向应用程序中添加 Web 功能变得简单。该控件可用于显示基于 Web 的帮助或者将用户引向可以购买产品的页面。
现有控件的变化在构建窗体时您最先注意到的事情之一就是对齐线,它可以在您构建用户界面时快速容易地对齐控件,如下图所示。
图 I-7 使用对齐线对齐控件。
当在设计图面上拖动控件时,您将看到对齐线而不是传统的网格,对齐线使完全对齐控件变得非常简单。对齐线使您能够对齐控件的边缘并且建议控件之间的适当间距。间距由新的 Margin 控件属性控制。
许多控件还包含新的自动完成属性,能够让控件自动为文件名、URL、自定义列表或者其他来源提供建议。
有关构建专业用户界面和新的应用程序配置基础结构的详细信息,请参阅第 5 章“构造用户界面”。
返回页首
第 6 章,“构建 Web 应用程序”
Visual Studio .NET 2002 和 2003 带来了 Web 开发的变革,较之于传统的 ASP,它们使 Web 开发人员的工作效率有了一个数量级的提高。ASP.NET 2.0 实现了再次提高。该产品团队的目标是将构建 Web 站点所需的代码量至少减少 70%。据说,当 Visual Studio 2005 发布时,该产品团队将很轻松达到这一目标。即使现在,许多站点无需编写代码即可构建完成。
使用 ASP.NET 1.0 和 1.1 版,您可以用声明的方式创建用户界面,但是您必须编写代码来连接到数据库,检索数据,然后将 UI 绑定到数据。在 ASP.NET 2.0 中有一些能够封装数据源的组件。这让您可以用声明的方式将网格连接到数据源(例如,SQL Server)。该绑定非常复杂。您必须更改数据并将更改推回数据库。此新功能也并非完全类似于过去设计时控件的“演示部件”。这些控件真正是按照 UI 外观完全可自定义的方式构造的,并且您可以通过编程或者声明的方式挂接到控件中。
Microsoft 还标识了一些关键方案,并将这些方案的基础结构内置到 .NET Framework。例如,ASP.NET 2.0 具有内置的成员身份和个性化的概念。成员身份是一个功能包,它提供了进行诸如登录、更改密码这样操作的公共控件。它还提供从后端数据库自动存储和检索信息的基础结构。最后,成员身份为您提供通过编程方式对用户进行操作的 API。
ASP.NET 还附带很多新控件以满足关键方案。例如,SiteMapPath控件提供内置的 Breadcrumb 功能,而 SiteMapDataSource使构建站点导航变得容易。母版页 (Master Page) 允许您定义页面某处的公共区,从而只改变内容区。缓存功能也进行了改进,现在可以针对每个用户来缓存数据。
有关 ASP.NET 2.0 的详细信息,请参阅第 6 章“构建 Web 应用程序”。
返回页首
第 7 章,“Microsoft .NET Framework 增强功能”
增强功能不仅限于开发环境。基础框架本身也包含了一些重要改进。第 2 章描述的泛型,是在 .NET Framework 2.0 版中引入的一项重要增强功能和强大的语言功能。本章介绍基类库、控制台和安全性增强功能。
.NET Framework 包含许多新类以进一步减少您需要编写的代码数量,并使向应用程序添加功能更加简单。StopWatch是一个新类,它可以轻松捕获所用时间的间隔。Trace- Source 类在如何跟踪事件数据方面为您提供了更大的灵活性。System.NET命名空间包含一些重要增强功能,例如,允许 Ping IP 地址。现在,已有一个 Internet Explorer 完全托管的包装。System.XML在性能和功能方面都有了显著增强,而且现在还包括对 XQuery的支持。
有关这些新类、控制台以及安全性增强功能的详细信息,请参阅第 7 章“Microsoft .NET Framework 增强功能”。
返回页首
第 8 章,“部署应用程序”
使用 Visual Basic 6.0,部署应用程序通常需要构建 Windows 安装程序包。该过程是必要的,因为 Visual Basic 6.0 基于 COM 且应用程序在其正常运行之前通常需要注册很多 DLL。安装程序还将创建“Start”菜单快捷方式,安装数据库,或执行其他所需的任务。
.NET Framework 1.0 和 1.1 版提供更多的安装选项。首先,1.0 版支持常称为 XCOPY 部署的功能。这就意味着,可将简单的应用程序直接复制到硬盘并执行。之所以可以这样做,是因为 .NET DLL 不需要注册。1.0 版还支持称为无接触 (NO-Touch) 部署的功能 — 有时也称为“零冲击部署”(href-exes)。在这种部署方法中,只需将可执行应用程序放在 Web 服务器上即可。当浏览到该应用程序的 URL 时,它将下载并运行。最终得到一个易于部署 Web 应用程序的完整 Windows 应用程序。对于 .NET,即使您需要创建 Windows 安装程序包,那么完成该工作的过程也大大简化了,这是因为您不必担心 DLL 注册问题。
对于 Intranet 应用程序而言,许多人将无接触部署视为一个绝好的方法。通过一个简单的入口,您可以确保用户始终运行该应用程序的最新版本。对于 Visual Studio 2005,Microsoft 极大地增强了通过 Web 分发的应用程序的功能。首先,应用程序现在可以下载并完全安装。此功能创建了适当的“Start”菜单快捷方式,而且(更为重要的是)它使应用程序即使在您脱机时也能完全正常运行。
ClickOnce 应用程序也不要求您必须是管理员才能安装它们(Windows 安装程序包则刚好相反)。最后,ClickOnce 允许您“引导”所需的其他软件作为安装过程的一部分。例如,作为应用程序安装的一部分,ClickOnce 应用程序可以安装 MDAC 甚至 .NET Framework(如果需要)。
有关 ClickOnce 的详细信息,请参阅第 8 章“部署应用程序”。
返回页首
支持
我们做出了很大的努力以确保本书的准确性。如果您遇到了问题,可以通过以下 Web 站点查看 Microsoft Press 为其书籍提供的勘误:http://www.microsoft.com/learning/support/。
如果您对本书或附带的光盘有任何疑问、评论或意见,请将它们发送到 Microsoft Press。
发送电子邮件至mspinput@microsoft.com
请将邮政信件发送到
MicrosoftPress
Attn: Introducing MicrosoftVisual Basic 2005 for Developers Editor
One MicrosoftWay
Redmond, WA 98052-6399
我们(本书的作者)很明显地看到,Microsoft 已经考察了编码的各个方面(包括代码编写本身、调试和部署),而且实际分析了如何才能使这些工作更有效率。这些增强功能影响深远,其中包括 Microsoft Visual Basic .NET 语言本身的改变、IDE 的改进、数据访问和显示的简化,还有一些改变提高了开发人员构造专业用户界面的工作效率,向框架中添加的众许多新类也减少了您编写的代码的数量,同时提高了部署的功能并扩大了部署
关 键 词: Visual Basic 2005 Visual Basic
本书的读者
本书为 Visual Basic 开发人员撰写。如果您是一名 Visual Basic 6 开发人员,您应该从第 1 章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”开始阅读,该章将带您快速进行 .NET Framework 开发。本书其余部分介绍 Visual Basic 的重要增强功能,这些增强功能可以提高开发应用程序的效率。
如果您已经是一名 .NET 开发人员,则可跳过第 1 章直接进入第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
本书的内容
本书包含八章。第一章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”对目前使用 Visual Basic 6 的开发人员最为有用。它介绍 .NET Framework 的开发。
本节对各章进行说明,并提供关于每个主题的介绍性信息。
重要事项要运行本书中的示例,需要安装两个软件:Visual Studio 2005 和 SQL Server 桌面、开发人员版、企业版或桌面引擎版。SQL Server 2000 的安装应该带有 Northwind 示例数据库。代码示例位于 MSDN 上的 http://msdn.microsoft.com/vbasic/VB6Migration。
返回页首
第 2 章,“Visual Basic 2005 的语言增强功能”
本章介绍泛型、My 对象和新的运算符。
泛型.NET Framework 最重要的增强功能可能就是引入了泛型。使用泛型可很轻松地创建特定于所存储的对象类型的集合。
Dim customerDictionaryAs New Dictionary(Of String, Customer)
customerDictionary.Add(currentCust.FullName, currentCust)
本例中,customerDictionary只能存储 Customer 类型的项。而且,查找结果明确是一个 String 值。因为该集合知道它所存储的对象类型(是 Customers 而不仅仅是“对象”),所以它可以提供完整的 Microsoft 智能感知,如下图所示。
图 I-1 泛型集合中的智能感知。
My Object Visual Basic .NET 的另一个重要增强功能就是简称为“My 对象”的功能。该功能提供对强大功能相当快速而简单的访问。例如,My.Application.Log.WriteEntry 可让您将信息写入一个文本文件、事件日志或者其他目标。My.Computer.Audio.PlaySystemSound 可以让您播放预定义的操作系统声音,而 My.Computer.Audio.Play 可以让您播放任何 .wav 文件。My 对象还为项目中的项提供默认实例。例如,您可以使用 My.Forms.MainForm.Show 来显示一个窗体而无需先创建其实例。
新运算符Visual Basic .NET 还包括很多新的关键字。IsNot 和 Nothing 一起使用可以使比较变得更加容易。过去,您通常必须编写 If Not X Is Nothing Then。现在,则这可以写成 If X IsNotNothing Then。Visual Basic .NET 还支持运算符重载、泛型,以及很多其他的高级编程功能。
有关这些增强功能的详细信息,请参阅第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
第 3 章,“Visual Studio 2005 集成开发环境”
Visual Basic 开发一直以来都与工作效率相关,而提供这种工作效率的关键工具就是 Visual Studio。使用 Visual Studio 2005,可以全面提升工作效率,可以更好、更容易地导航帮助内容,实现更简单的开发环境自定义以及更高效的编码和调试体验,其中包括“编辑并继续 (Edit-And-Continue)”的重新引入。
编码和调试增强功能当使用新的集成开发环境 (IDE) 时,您将看到为了在编码中加入“上下文”而做出的极大努力。即,在很多情况下,您不必导航到 IDE 中的其他窗口来获得需要的信息。在其他情况下,IDE 提供智能信息筛选功能,以便将最有可能的选择置于最突出的位置,并防止极少使用的选项干扰视图。在您第一次访问对象属性时可以看到该功能,如下图所示。
图 I-2 对象成员的渐进式显示。
您会发现,Visual Studio 2005 可以显示对象的所有成员,也可以通过筛选列表只显示最常用的成员,从而使您轻松找到所需的成员(例如,Connection 的 String 属性)。
Visual Studio 2005 还进一步扩展了常见的 Visual Basic 代码展开功能。您已经习惯了在起始处键入 Function 声明,然后让 IDE 自动插入 End Function。现在,这已经扩展到诸如属性声明这样的内容。键入 public property UserName as String并按 Enter 键可以自动插入下列代码:
Public Property UserName() As String
Get
End Get
Set(ByVal value As String)
End Set
End Property
Visual Studio 2005 还在调试时将各种信息置于您容易获得的位置,使您可以方便操作各种简单和复杂类型,而无需打开并浏览“Watch”窗口。下图显示如何直接在代码编辑器中显示一个复杂类型。
图 I-3 就地显示复杂类型的属性。
Visual Basic 6 提供的最大的工作效率增强功能之一就是“编辑并继续”。该功能曾经是调试过程中的主要手段,遗憾的是,以前 Visual Studio .NET 2002 或 2003 中没有包括该功能。现在“编辑并继续”又可以使用了,使您可以修复错误然后继续执行,而不用停止和重新启动。
IDE自定义和帮助系统增强功能Visual Basic 开发人员高度评价了自定义其开发环境,以及将窗口置于对他们最有利位置的功能。Visual Studio 一直都提供这种功能,但是在 Visual Studio 2005 中,该功能在几个关键部分进行了重大增强。首先,Visual Studio 2005 解决了“我不知道该窗口将停靠在何处”这一问题 — 当发生该问题时,虽然您认为已经将窗口进行了正确定位,但是当您放开它时,窗口或者没有停靠,或者没有按照您预期的方式停靠。在 Visual Studio 2005 中,停靠具有“停靠指导”,如下图所示。
图 I-4 使用停靠指导。
您只需将窗口放置到合适的箭头上就可以实现将其停靠在另一个窗口正上方、上方、右方、下方或者左方的功能。不用再猜测!还有,您的所有 IDE 自定义结果都可以导出和导入。
另外,帮助系统有了很大的改进,为您提供了更好的“F1”体验,而且可以让您访问最新的联机帮助。帮助系统甚至挂接到 Web 站点的“Code Wise”社区,它提供直接在 IDE 中访问 CodeGuru、Net247 和 ASP.NET 等站点的功能。
有关 Visual Studio 2005 提供的重要工作效率增强功能的详细信息,您可以直接参阅第 3 章“Visual Studio 2005 集成开发环境”。
返回页首
第 4 章,“构建以数据为中心的应用程序”
Visual Studio 2005 附带很多用于构建以数据为中心的应用程序的强大工具。首先,有一些构建于 ADO.NET 1.0 之上的新对象。这包括一个类型化 DataAdapter 类,它使得调用存储过程像调用函数一样容易。该工具箱还包含一个很容易进行自定义和控制的新网格控件。最后,IDE 包含一个新的“Data Sources”窗口,帮助您管理这些对象以及在设计时创建您的用户界面。
“Data Sources”窗口用于生成您将在整个给定应用程序中使用的类型化 DataAdapter 和类型 DataSet。一旦您连接到数据库并选择了要使用的表和过程,那么只需将对象从“Data Sources”窗口拖到设计图面来创建用户界面,如下图所示。
图 I-5 通过“Data Sources”窗口生成用户界面。
您可以看到,默认情况下,当 customers 表放置于设计图面时,后者使用新的GridView控件来呈现它。您也可以让它呈现为单个字段,而且可以确定用于每个字段的控件类型。
您还可以使用 DataSet 设计器将方法映射到存储过程。这使得调用存储过程像下面的代码一样简单:
ds = MyDataSet.GetByCustomerID(customerID)
有关在 Visual Studio 2005 中使用数据的详细信息,请参阅第 4 章“构建以数据为中心的应用程序”。
返回页首
第 5 章,“构造用户界面”
Visual Basic 开发人员在快速构建用户界面方面从未遇到任何困难。如果 Visual Basic 在某一方面始终出类拔萃,那就是工具箱和窗体设计器方面。但是,Visual Basic 开发人员一直不断地要求,“给我们提供 Microsoft 在其应用程序中所使用的用户界面控件”。更具体地说,开发人员需要很多用户界面元素,例如 Microsoft Office 等产品中的漂浮工具栏。
新控件您将高兴地了解到,此版本的 Visual Studio 不仅仅专注于有丰富素材的工具箱,它确实在努力地使构建专业水平的用户界面变得更容易,并且无需借助于第三方组件或进行大量的自定义控件开发。第 5 章分析的第一个控件是 ToolStrip,如下图所示。
图 I-6 MenuStrip、StatusStrip 和 ToolStrip。
您可以看到用两个 ToolStrip控件创建的一个简单窗体。这完全可以在几秒钟之内完成,但事实上还有一些内容需要讨论。首先,您可以看到 ToolStrip控件支持“漂浮”,即用户可在运行时拖动 Tool- Strip 控件并对其进行排列。其次,最上方的 ToolStrip包含您所熟悉的标准图标。这些图标均通过一次单击添加。如果有一些您不想要的图标,只需选中它们然后按 Delete 键即可。ToolStrip不仅仅支持按钮。它还包含文本框、下拉列表、标签,等等。最后,该工具栏与 Microsoft Office 的工具栏极为相似,使得可以轻松构建具有专业外观的应用程序,用户会很自然地懂得如何使用这些应用程序。
菜单栏和状态栏构建于 ToolStrip基础结构之上,使您的菜单栏或状态栏具有各种各样的控件和功能。
在工具箱中,您还会发现 ActiveX Web 浏览器控件的完整 .NET 包装,这使得向应用程序中添加 Web 功能变得简单。该控件可用于显示基于 Web 的帮助或者将用户引向可以购买产品的页面。
现有控件的变化在构建窗体时您最先注意到的事情之一就是对齐线,它可以在您构建用户界面时快速容易地对齐控件,如下图所示。
图 I-7 使用对齐线对齐控件。
当在设计图面上拖动控件时,您将看到对齐线而不是传统的网格,对齐线使完全对齐控件变得非常简单。对齐线使您能够对齐控件的边缘并且建议控件之间的适当间距。间距由新的 Margin 控件属性控制。
许多控件还包含新的自动完成属性,能够让控件自动为文件名、URL、自定义列表或者其他来源提供建议。
有关构建专业用户界面和新的应用程序配置基础结构的详细信息,请参阅第 5 章“构造用户界面”。
返回页首
第 6 章,“构建 Web 应用程序”
Visual Studio .NET 2002 和 2003 带来了 Web 开发的变革,较之于传统的 ASP,它们使 Web 开发人员的工作效率有了一个数量级的提高。ASP.NET 2.0 实现了再次提高。该产品团队的目标是将构建 Web 站点所需的代码量至少减少 70%。据说,当 Visual Studio 2005 发布时,该产品团队将很轻松达到这一目标。即使现在,许多站点无需编写代码即可构建完成。
使用 ASP.NET 1.0 和 1.1 版,您可以用声明的方式创建用户界面,但是您必须编写代码来连接到数据库,检索数据,然后将 UI 绑定到数据。在 ASP.NET 2.0 中有一些能够封装数据源的组件。这让您可以用声明的方式将网格连接到数据源(例如,SQL Server)。该绑定非常复杂。您必须更改数据并将更改推回数据库。此新功能也并非完全类似于过去设计时控件的“演示部件”。这些控件真正是按照 UI 外观完全可自定义的方式构造的,并且您可以通过编程或者声明的方式挂接到控件中。
Microsoft 还标识了一些关键方案,并将这些方案的基础结构内置到 .NET Framework。例如,ASP.NET 2.0 具有内置的成员身份和个性化的概念。成员身份是一个功能包,它提供了进行诸如登录、更改密码这样操作的公共控件。它还提供从后端数据库自动存储和检索信息的基础结构。最后,成员身份为您提供通过编程方式对用户进行操作的 API。
ASP.NET 还附带很多新控件以满足关键方案。例如,SiteMapPath控件提供内置的 Breadcrumb 功能,而 SiteMapDataSource使构建站点导航变得容易。母版页 (Master Page) 允许您定义页面某处的公共区,从而只改变内容区。缓存功能也进行了改进,现在可以针对每个用户来缓存数据。
有关 ASP.NET 2.0 的详细信息,请参阅第 6 章“构建 Web 应用程序”。
返回页首
第 7 章,“Microsoft .NET Framework 增强功能”
增强功能不仅限于开发环境。基础框架本身也包含了一些重要改进。第 2 章描述的泛型,是在 .NET Framework 2.0 版中引入的一项重要增强功能和强大的语言功能。本章介绍基类库、控制台和安全性增强功能。
.NET Framework 包含许多新类以进一步减少您需要编写的代码数量,并使向应用程序添加功能更加简单。StopWatch是一个新类,它可以轻松捕获所用时间的间隔。Trace- Source 类在如何跟踪事件数据方面为您提供了更大的灵活性。System.NET命名空间包含一些重要增强功能,例如,允许 Ping IP 地址。现在,已有一个 Internet Explorer 完全托管的包装。System.XML在性能和功能方面都有了显著增强,而且现在还包括对 XQuery的支持。
有关这些新类、控制台以及安全性增强功能的详细信息,请参阅第 7 章“Microsoft .NET Framework 增强功能”。
返回页首
第 8 章,“部署应用程序”
使用 Visual Basic 6.0,部署应用程序通常需要构建 Windows 安装程序包。该过程是必要的,因为 Visual Basic 6.0 基于 COM 且应用程序在其正常运行之前通常需要注册很多 DLL。安装程序还将创建“Start”菜单快捷方式,安装数据库,或执行其他所需的任务。
.NET Framework 1.0 和 1.1 版提供更多的安装选项。首先,1.0 版支持常称为 XCOPY 部署的功能。这就意味着,可将简单的应用程序直接复制到硬盘并执行。之所以可以这样做,是因为 .NET DLL 不需要注册。1.0 版还支持称为无接触 (NO-Touch) 部署的功能 — 有时也称为“零冲击部署”(href-exes)。在这种部署方法中,只需将可执行应用程序放在 Web 服务器上即可。当浏览到该应用程序的 URL 时,它将下载并运行。最终得到一个易于部署 Web 应用程序的完整 Windows 应用程序。对于 .NET,即使您需要创建 Windows 安装程序包,那么完成该工作的过程也大大简化了,这是因为您不必担心 DLL 注册问题。
对于 Intranet 应用程序而言,许多人将无接触部署视为一个绝好的方法。通过一个简单的入口,您可以确保用户始终运行该应用程序的最新版本。对于 Visual Studio 2005,Microsoft 极大地增强了通过 Web 分发的应用程序的功能。首先,应用程序现在可以下载并完全安装。此功能创建了适当的“Start”菜单快捷方式,而且(更为重要的是)它使应用程序即使在您脱机时也能完全正常运行。
ClickOnce 应用程序也不要求您必须是管理员才能安装它们(Windows 安装程序包则刚好相反)。最后,ClickOnce 允许您“引导”所需的其他软件作为安装过程的一部分。例如,作为应用程序安装的一部分,ClickOnce 应用程序可以安装 MDAC 甚至 .NET Framework(如果需要)。
有关 ClickOnce 的详细信息,请参阅第 8 章“部署应用程序”。
返回页首
支持
我们做出了很大的努力以确保本书的准确性。如果您遇到了问题,可以通过以下 Web 站点查看 Microsoft Press 为其书籍提供的勘误:http://www.microsoft.com/learning/support/。
如果您对本书或附带的光盘有任何疑问、评论或意见,请将它们发送到 Microsoft Press。
发送电子邮件至mspinput@microsoft.com
请将邮政信件发送到
MicrosoftPress
Attn: Introducing MicrosoftVisual Basic 2005 for Developers Editor
One MicrosoftWay
Redmond, WA 98052-6399
Visual Basic.Net语言革新
要经常创建Web应用程序,开发人员必须按照可升级、够稳定和可重用的规律来开发。在过去的几年里,面向对象的编程已经成为创建符合要求的系统的最主要方法。使用面向对象的编程可以使那些大规模的系统程序更容易读懂,更容易纠错,升级更快。
为了使Visual Basic的开发人员从面向对象的设计方法中受益并使企业网站应用程序的开发更简单,下一个版本的Visual Basic------Visual Basic .NET将会支持完全的面向对象的编程功能包括继承的实现。有了这些新的语言功能,Visual Basic .NET将会带来所有我们所需要的功能,更快、更有效的开发企业级的应用程序,同时,作为世界最流行的开发软件,保持了容易上手的特点。
Visual Basic .NET将会提供一流的面向对象的编程语言,同时带来了许多新的功能,比如继承的实现,重载和参数化构造函数。 另外,随着现代化的语言结构的调整,如结构化的异常处理,代码更易于维护,这使得开发人员将可以使用简洁明了的自由线程来编写高扩展性的代码。Visual Basic 将会提供开发人员所需要的所有语言特点来使他们能建立稳定、可扩展的分布式Web应用程序,这些应用程序将会包括以下新功能:
面向对象编程的新功能
继承性
重载
参数化构造函数
现代化附加的新功能
自由线程
结构化的异常处理
严格类型检测
共享成员
初始化功能
语言变革的历史
Visual BasiC语言随着Windows平台基本结构的改变而做出相应的升级,这已经有了一个很长的历史。比如说,QuickBasic为了支持Windows 3.0的图形化用户界面而做出的重大改变促成了后来Visual Basic的第一个版本的发行。在Visual Basic 4.0中,随着转向基于COM的编程,使程序结构中出现了DLL。另外,在Visual Basic 5.0中,它开始支持建立COM控件。
面向对象的编程
传统的编程语言有很多缺点,比如说,它的数据是分布在整个代码段中分开存放的;任何写成结构化的代码并不是模块;因为数据元素对任何代码都是可操作的,所以即使没有告诉开发者,任何人都可以对数据做改动,这可能会造成运行时的错误并且极难纠错。还有,程序的维护是一项极其繁重的工作。要在试着去理解改动一行代码对整个程序会造成的影响之后再去修改会非常困难。最后,让程序员级管理代码又管理数据而造成的信任问题会使代码的重用率降得非常低。
面向对象的编程解决了所有这些问题。他把用来操作数据的方法连同数据一起打包成一个对象。对象的数据可以被隐藏,以防止非法的改动。另外,一个对象会登记出一套公用的可用于操作数据的方法。这就是所谓的封装性。因为具体的实施细节使于实际界面分离的,所以我们可以在不影响主要程序及数据的前提下,以后再改动这个被调用的后台运行的对象程序。
面向对象的编程能够让程序的开发人员通过继承来重用代码和数据。通过继承预先定义的对象,开发者可以更经常的创建复杂的应用。由于编写新的代码常常会带来产生潜在的Bug的可能性,因此重用经过测试的代码会大大减少Bug产生的可能。
为了能够满足所有这些要求,Visual Basic .NET将会提供更多的语言功能来实现所有上面提到的功能,使其成为第一流的面向对象的编程语言。
继承性
一个大家强烈要求Visual Basic实现的功能就是继承性的实现了。Internet时代发展需要迅速的拼装和大块的重用。Visual Basic现在已经支持完全的实施继承,包括窗体继承。
开发者可以用信的关键字Inherits 从一个已经存在的类中衍生出去。
Class1
Function GetCustomer()
...
End Function
Class2
Inherits Class1
Function GetOrders()
...
End Function
表达式支持所有的一般的与继承相关的属性。衍生类的实例支持所有的基类的方法和接口,当然的,衍生类也可以扩展这些方法和接口。
衍生类可以使用Overrides关键字重载基类定义的方法。为了降低编程的错误率,Visual Basic防止你随便重载一个函数,只有那些被声明为“可重载”的函数才允许被衍生类重载。
重载
Visual Basic现在已经支持函数重载,这样,程序员就可以通过使用不同的参数类型来使用名称相同而功能不同的子过程或者函数了。
当你的对象模型要求你使用相似的过程名来操作不同类型的数据的时候,重载就变得非常有用了。比如说,一个可以显示多种数据类型的类可以使用下面的显示子程序:
Overloads Sub Display (theChar As Char)
...
Overloads Sub Display (theInteger As Integer)
...
Overloads Sub Display (theDouble As Double)
如果没有重载,你就不得不为每一个子过程建立唯一的名称或者只能使用Variant参数。重载提供了一种更清楚更有效的方法来处理多种数据类型。
参数化构造函数
参数化构造函数(简称构造函数)使你能够在建立一个新的实例的同时把参数传递给它。构造函数对面向对象的编程来讲是十分关键的,因为它们使实例的建立者能够传递自定义参数的创建代码。它们允许用一条简单的表达式来创建并初始化一个新的实体,从而简化了客户端的代码。
更多现代化语言的新功能Visual Basic .NET新增了许多新功能,简化了编写更稳定、可扩展的应用程序的开发过程。这些新功能包括自由线程,结构化的异常处理,严格类型检测以及一些如初始化功能,共享成员等的提高生产效率的新功能。
自由线程
现在,当开发者用Visual Basic建立一个应用程序的时候,他的代码已经是同步的了。意思是在下一行语句被输入前,上一行的语句必须被执行完毕。在开发Web应用程序的时候,可扩展性是关键。开发者需要可以实时处理的工具。
自由线程提供了非同步处理机制,开发者可以在不影响其他应用程序的前提下新建一个线程来进行一些长时间的任务、复杂的查询请求或者多块同步计算。
Dim b As BackGroundWork
Dim t As Thread
Set b = New BackGroundWork()
Set t = New Thread(New ThreadStart(AddressOf b.Doit))
t.Start
End Sub
Class BackGroundWork
Sub DoIt()
…
End Sub
End Class
结构化的异常处理
开发企业应用程序需要创建可重用的易维护的组件。支持错误处理曾经是BasiC语言的一个非常出色的方面。但是,开发人员发现编写一个可靠的错误处理程序就意味着大段的重复代码。使用现有的On Error GoTo 表达式常常会降低大型应用程序的开发和维护过程。它的名称就说明了一些问题:GoTo 意味着一旦错误发生,控制权就会被转移到一个子程序内标号的段落。那样,当错误发生时,程序将会相遇到一个标准GoTo一样转移到一个新的地点执行程序,然后,通过另外的GoTo或者Exit来跳出这个过程。同时处理几个错误的时候,当他们使用了不同Resume和 Next的组合而执行路径又没有完全处理好时,就会很快导致非法的代码和Bug。
运用Try...Catch...Finally,这些问题迎刃而解,开发者可以把异常处理直接嵌入程序,并且,会有一个控制结构,专门用来编写清空代码,无论在通常情况还是在例外情况下,这段代码都会被执行。
Sub SEH()
Try
Open "TESTFILE" For Output As #1
Write #1, CustomerInformation
Catch
Kill "TESTFILE"
Finally
Close #1
End try
End Sub
严格类型检测
现在的Visual BasiC语言在类型声明上是非常自由的。除了使用引用以外的其他参数传递,Visual Basic编译器可以生成运行时的强制类型转换,允许几乎所有的类型转换成所有其它的类型。如果被转换的数据类型不允许任何的数据丢失,那么使用运行时的强制类型转换将会失败。使用新的附加的编译选项, Visual Basic会针对任何有可能产生运行时错误的类型转换产生编译错误。对于那些可能会在运行时产生错误的类型转换, 这个Strict的选项将会使Visual Basic产生编译错误以改善类型安全性。这些错误包含一些用户无法预计的错误,如数字和字符串之间的自动转换等等。
共享成员
共享成员是指那些可以被类的所有实例共享的数据和函数成员。作为具有继承性的Visual Basic应用程序,在类中所有的实例中共享一个数据成员或者函数是需要的。一个共享成员是独立于类中任何特定的实例而存在的。一个共享的方法是一个不同于一般方法的方法,它并不隐式地传递出一个类的实例。出于这个原因,在共享方法中,不允许访问没有指定对象的非共享的数据成员。公共的共享成员可以被远程访问并且它们可以被后绑定到类的实例。
初始化功能
Visual Basic .NET支持在变量定义行直接初始化变量。初始化功能可以在任何场合使用,包括在控制结构内部。初始化功能的这种过程级的语法声明与在定义变量以后立即初始化的作用是一样的。换种说法,比如:
Dim X As Integer = 1 与以下代码是相同的:
Dim X As Integer X = 1 小结Visual Basic.Net是目前最好的一种面向对象的编程语言之一。通过使用Visual Basic .NET,开发者可以利用自由线程设计出具有良好的可扩展性的代码。这些代码具备了结构化异常处理这样的现代语言特性。Visual Basic将为设计健壮、可扩展的分布式网络应用的开发者在语言特点上提供所有的帮助。
为了使Visual Basic的开发人员从面向对象的设计方法中受益并使企业网站应用程序的开发更简单,下一个版本的Visual Basic------Visual Basic .NET将会支持完全的面向对象的编程功能包括继承的实现。有了这些新的语言功能,Visual Basic .NET将会带来所有我们所需要的功能,更快、更有效的开发企业级的应用程序,同时,作为世界最流行的开发软件,保持了容易上手的特点。
Visual Basic .NET将会提供一流的面向对象的编程语言,同时带来了许多新的功能,比如继承的实现,重载和参数化构造函数。 另外,随着现代化的语言结构的调整,如结构化的异常处理,代码更易于维护,这使得开发人员将可以使用简洁明了的自由线程来编写高扩展性的代码。Visual Basic 将会提供开发人员所需要的所有语言特点来使他们能建立稳定、可扩展的分布式Web应用程序,这些应用程序将会包括以下新功能:
面向对象编程的新功能
继承性
重载
参数化构造函数
现代化附加的新功能
自由线程
结构化的异常处理
严格类型检测
共享成员
初始化功能
语言变革的历史
Visual BasiC语言随着Windows平台基本结构的改变而做出相应的升级,这已经有了一个很长的历史。比如说,QuickBasic为了支持Windows 3.0的图形化用户界面而做出的重大改变促成了后来Visual Basic的第一个版本的发行。在Visual Basic 4.0中,随着转向基于COM的编程,使程序结构中出现了DLL。另外,在Visual Basic 5.0中,它开始支持建立COM控件。
面向对象的编程
传统的编程语言有很多缺点,比如说,它的数据是分布在整个代码段中分开存放的;任何写成结构化的代码并不是模块;因为数据元素对任何代码都是可操作的,所以即使没有告诉开发者,任何人都可以对数据做改动,这可能会造成运行时的错误并且极难纠错。还有,程序的维护是一项极其繁重的工作。要在试着去理解改动一行代码对整个程序会造成的影响之后再去修改会非常困难。最后,让程序员级管理代码又管理数据而造成的信任问题会使代码的重用率降得非常低。
面向对象的编程解决了所有这些问题。他把用来操作数据的方法连同数据一起打包成一个对象。对象的数据可以被隐藏,以防止非法的改动。另外,一个对象会登记出一套公用的可用于操作数据的方法。这就是所谓的封装性。因为具体的实施细节使于实际界面分离的,所以我们可以在不影响主要程序及数据的前提下,以后再改动这个被调用的后台运行的对象程序。
面向对象的编程能够让程序的开发人员通过继承来重用代码和数据。通过继承预先定义的对象,开发者可以更经常的创建复杂的应用。由于编写新的代码常常会带来产生潜在的Bug的可能性,因此重用经过测试的代码会大大减少Bug产生的可能。
为了能够满足所有这些要求,Visual Basic .NET将会提供更多的语言功能来实现所有上面提到的功能,使其成为第一流的面向对象的编程语言。
继承性
一个大家强烈要求Visual Basic实现的功能就是继承性的实现了。Internet时代发展需要迅速的拼装和大块的重用。Visual Basic现在已经支持完全的实施继承,包括窗体继承。
开发者可以用信的关键字Inherits 从一个已经存在的类中衍生出去。
Class1
Function GetCustomer()
...
End Function
Class2
Inherits Class1
Function GetOrders()
...
End Function
表达式支持所有的一般的与继承相关的属性。衍生类的实例支持所有的基类的方法和接口,当然的,衍生类也可以扩展这些方法和接口。
衍生类可以使用Overrides关键字重载基类定义的方法。为了降低编程的错误率,Visual Basic防止你随便重载一个函数,只有那些被声明为“可重载”的函数才允许被衍生类重载。
重载
Visual Basic现在已经支持函数重载,这样,程序员就可以通过使用不同的参数类型来使用名称相同而功能不同的子过程或者函数了。
当你的对象模型要求你使用相似的过程名来操作不同类型的数据的时候,重载就变得非常有用了。比如说,一个可以显示多种数据类型的类可以使用下面的显示子程序:
Overloads Sub Display (theChar As Char)
...
Overloads Sub Display (theInteger As Integer)
...
Overloads Sub Display (theDouble As Double)
如果没有重载,你就不得不为每一个子过程建立唯一的名称或者只能使用Variant参数。重载提供了一种更清楚更有效的方法来处理多种数据类型。
参数化构造函数
参数化构造函数(简称构造函数)使你能够在建立一个新的实例的同时把参数传递给它。构造函数对面向对象的编程来讲是十分关键的,因为它们使实例的建立者能够传递自定义参数的创建代码。它们允许用一条简单的表达式来创建并初始化一个新的实体,从而简化了客户端的代码。
更多现代化语言的新功能Visual Basic .NET新增了许多新功能,简化了编写更稳定、可扩展的应用程序的开发过程。这些新功能包括自由线程,结构化的异常处理,严格类型检测以及一些如初始化功能,共享成员等的提高生产效率的新功能。
自由线程
现在,当开发者用Visual Basic建立一个应用程序的时候,他的代码已经是同步的了。意思是在下一行语句被输入前,上一行的语句必须被执行完毕。在开发Web应用程序的时候,可扩展性是关键。开发者需要可以实时处理的工具。
自由线程提供了非同步处理机制,开发者可以在不影响其他应用程序的前提下新建一个线程来进行一些长时间的任务、复杂的查询请求或者多块同步计算。
Dim b As BackGroundWork
Dim t As Thread
Set b = New BackGroundWork()
Set t = New Thread(New ThreadStart(AddressOf b.Doit))
t.Start
End Sub
Class BackGroundWork
Sub DoIt()
…
End Sub
End Class
结构化的异常处理
开发企业应用程序需要创建可重用的易维护的组件。支持错误处理曾经是BasiC语言的一个非常出色的方面。但是,开发人员发现编写一个可靠的错误处理程序就意味着大段的重复代码。使用现有的On Error GoTo 表达式常常会降低大型应用程序的开发和维护过程。它的名称就说明了一些问题:GoTo 意味着一旦错误发生,控制权就会被转移到一个子程序内标号的段落。那样,当错误发生时,程序将会相遇到一个标准GoTo一样转移到一个新的地点执行程序,然后,通过另外的GoTo或者Exit来跳出这个过程。同时处理几个错误的时候,当他们使用了不同Resume和 Next的组合而执行路径又没有完全处理好时,就会很快导致非法的代码和Bug。
运用Try...Catch...Finally,这些问题迎刃而解,开发者可以把异常处理直接嵌入程序,并且,会有一个控制结构,专门用来编写清空代码,无论在通常情况还是在例外情况下,这段代码都会被执行。
Sub SEH()
Try
Open "TESTFILE" For Output As #1
Write #1, CustomerInformation
Catch
Kill "TESTFILE"
Finally
Close #1
End try
End Sub
严格类型检测
现在的Visual BasiC语言在类型声明上是非常自由的。除了使用引用以外的其他参数传递,Visual Basic编译器可以生成运行时的强制类型转换,允许几乎所有的类型转换成所有其它的类型。如果被转换的数据类型不允许任何的数据丢失,那么使用运行时的强制类型转换将会失败。使用新的附加的编译选项, Visual Basic会针对任何有可能产生运行时错误的类型转换产生编译错误。对于那些可能会在运行时产生错误的类型转换, 这个Strict的选项将会使Visual Basic产生编译错误以改善类型安全性。这些错误包含一些用户无法预计的错误,如数字和字符串之间的自动转换等等。
共享成员
共享成员是指那些可以被类的所有实例共享的数据和函数成员。作为具有继承性的Visual Basic应用程序,在类中所有的实例中共享一个数据成员或者函数是需要的。一个共享成员是独立于类中任何特定的实例而存在的。一个共享的方法是一个不同于一般方法的方法,它并不隐式地传递出一个类的实例。出于这个原因,在共享方法中,不允许访问没有指定对象的非共享的数据成员。公共的共享成员可以被远程访问并且它们可以被后绑定到类的实例。
初始化功能
Visual Basic .NET支持在变量定义行直接初始化变量。初始化功能可以在任何场合使用,包括在控制结构内部。初始化功能的这种过程级的语法声明与在定义变量以后立即初始化的作用是一样的。换种说法,比如:
Dim X As Integer = 1 与以下代码是相同的:
Dim X As Integer X = 1 小结Visual Basic.Net是目前最好的一种面向对象的编程语言之一。通过使用Visual Basic .NET,开发者可以利用自由线程设计出具有良好的可扩展性的代码。这些代码具备了结构化异常处理这样的现代语言特性。Visual Basic将为设计健壮、可扩展的分布式网络应用的开发者在语言特点上提供所有的帮助。
VB.Net语言方面的改进
我们在很多的编程论坛或者新闻组中可以看到C++的拥护者将VB称为
一个玩具语言(Toy Language)。其中VB最
被人诟病的是它不真正支持面向对象编程(oop)。
在新的Visual Basic中,这些都将成为过去。Visual Basic.NET将真
正支持oop。继承(inheritance)、多态
(polymorphism)以及重载(overloading)。当然还不止这些。包括一
些新的数据结构、结构性的错误控制(Error
Handing)以及线程。这些都将被新的VB所支持。
继承
假设你编写了一个只包含一个函数的名称为BaseClass的基本
类:
Function GetCustomerName()
' Do some stuff
End Function
如果你想建立一个新类,并使用BaseClass中的GetCustomerName
函数。但有不想重写一编代码。那么通过继承,
你可以这样编写新类:
Inherits BaseClass
Function GetCustomerID()
' Do some stuff
End Function
重载
重载就是建立两个具有同样你名称但是参数属性不同的函数的过
程。假设有GetCustomID函数根据输入输出用
户的ID号码。那么该函数可能有以下两种类型:
Function GetCustomerID(custname as string) As Integer
' 通过用户名获得用户ID
End Function
Function GetCustomerID(purch as long) As Integer
' 根据购物单号码获得用户ID
End Function
通过重载,你就可以根据不同类型的输入调用同一个函数。
实际上现在的VB在某种程度上提供了重载的功能,考虑下面的函数:
Function GetCustomID(vIN As Variant) As Long
GetCustomID = vIN
End Function
你可以以下面两种方式调用
ID = GetCustomID("123")
或者
ID = GetCustomID(123)
那么为什么还要在新版本中引进重载呢?这是因为新的Visual
Basic引进了新的特性:类型安全(default
type safety)。在Visual Basic.NET中,Variant类型将不复存在,
详细的介绍看下面关于升级部分的内容。
多态
多态是在一个类中重新定义一个函数的过程。例如你需要建立一
个基于BaseClass类的子类,但是又需要重新
编写GetCustomerName函数,在新版的VB中,你就可以这样写:
Inherits BaseClass
Function GetOrders()
Overrides Function GetOrders()
...
End Function
线程
新的Visual BasiC语言结构部分将包含建立多线程,一个线程建
立的范例如下:
set t = New Thread(New Threadstart
(AddressOf(BaseClass.Function1))
从上面的范例还可以看到,Visual Basic.NET中的AddressOf函
数将真正返回函数的指针。这在进行API调用,
例如回调函数方面将是很有帮助的。
错误处理(Error Handling)
Visual Basic.NET的另外一个大的改进就是错误处理。Visual
Basic将提供try…catch…finally结构,就象
Delphi中的那样(微软的原文是:just like those "respectable"
languages :-))。例如:
Sub SafeWrite()
Try
Open "Testfile"
...
Write #1
Catch
Kill "Testfile"
Finally
Close #1
End Try
End Sub
升级
当代码升级后,Visual Basic.NET会建立一个新的升级工程。下
面通过几个例子来说明你的代码做了那些升级
Variant类型到Object类型
以前版本的Visual Basic支持Variant数据类型,该类型可以设
定为除了固定程度字符串外的任何原始数据类
型和Empty,Error,Nothing和Null。在Visual Basic.NET中,Object
数据类型可以设定为任何原始数据类型和Empty,
Error,Nothing,Null和对象指针。当你的工程升级到Visual
Basic.NET后,任何Variant定义都会改变为Object。
同样,当你在编辑器中插入代码时,Variant关键字也会被替换为
Object。
Integer数据类型到Short数据类型
在Visual Basic 6.0中,16bit数现在称为Short。32bit数称为
Integer(64bit数称为Long)。当工程升级后,
数据定义会做如下改动:
Dim x As Integer
dim y as Long
更改为:
Dim x As Short
dim y as Integer
属性语法
Visual Basic.NET对于自定义属性的语法作乐更加直观的更改,
将Get和Set合而为一。例如原来的属性如下:
Property Get MyProperty() As Integer
m_MyProperty = MyProperty
End Property
Property Let MyProperty(NewValue As Integer)
m_MyProperty = NewValue
End Property
升级后更改为:
Property MyProperty() As Short
Get
m_MyProperty = MyProperty
End Get
Set
m_MyProperty = Value
End Set
End Property
VB窗体到Windows窗体
Visual Basic.NET包含新的窗体包,Windows窗体,Windows窗体
包含内含菜单编辑器。你的VB窗体会升级到
Windows窗体。
界面
在先前的版本中,公用类界面对于用户总是隐藏的。在Visual
Basic.NET中,公用类可以在代码窗口中浏览和编辑。
升级报告及注释
当工程升级后,升级报告会添加到你的工程中,详细列出所有升
级后的你所需要对代码做的更改。同时代码中
会加入注释提示你注意任何潜在的问题。这些注释自动出现在
Visual Basic.NET的任务列表中。
一个玩具语言(Toy Language)。其中VB最
被人诟病的是它不真正支持面向对象编程(oop)。
在新的Visual Basic中,这些都将成为过去。Visual Basic.NET将真
正支持oop。继承(inheritance)、多态
(polymorphism)以及重载(overloading)。当然还不止这些。包括一
些新的数据结构、结构性的错误控制(Error
Handing)以及线程。这些都将被新的VB所支持。
继承
假设你编写了一个只包含一个函数的名称为BaseClass的基本
类:
Function GetCustomerName()
' Do some stuff
End Function
如果你想建立一个新类,并使用BaseClass中的GetCustomerName
函数。但有不想重写一编代码。那么通过继承,
你可以这样编写新类:
Inherits BaseClass
Function GetCustomerID()
' Do some stuff
End Function
重载
重载就是建立两个具有同样你名称但是参数属性不同的函数的过
程。假设有GetCustomID函数根据输入输出用
户的ID号码。那么该函数可能有以下两种类型:
Function GetCustomerID(custname as string) As Integer
' 通过用户名获得用户ID
End Function
Function GetCustomerID(purch as long) As Integer
' 根据购物单号码获得用户ID
End Function
通过重载,你就可以根据不同类型的输入调用同一个函数。
实际上现在的VB在某种程度上提供了重载的功能,考虑下面的函数:
Function GetCustomID(vIN As Variant) As Long
GetCustomID = vIN
End Function
你可以以下面两种方式调用
ID = GetCustomID("123")
或者
ID = GetCustomID(123)
那么为什么还要在新版本中引进重载呢?这是因为新的Visual
Basic引进了新的特性:类型安全(default
type safety)。在Visual Basic.NET中,Variant类型将不复存在,
详细的介绍看下面关于升级部分的内容。
多态
多态是在一个类中重新定义一个函数的过程。例如你需要建立一
个基于BaseClass类的子类,但是又需要重新
编写GetCustomerName函数,在新版的VB中,你就可以这样写:
Inherits BaseClass
Function GetOrders()
Overrides Function GetOrders()
...
End Function
线程
新的Visual BasiC语言结构部分将包含建立多线程,一个线程建
立的范例如下:
set t = New Thread(New Threadstart
(AddressOf(BaseClass.Function1))
从上面的范例还可以看到,Visual Basic.NET中的AddressOf函
数将真正返回函数的指针。这在进行API调用,
例如回调函数方面将是很有帮助的。
错误处理(Error Handling)
Visual Basic.NET的另外一个大的改进就是错误处理。Visual
Basic将提供try…catch…finally结构,就象
Delphi中的那样(微软的原文是:just like those "respectable"
languages :-))。例如:
Sub SafeWrite()
Try
Open "Testfile"
...
Write #1
Catch
Kill "Testfile"
Finally
Close #1
End Try
End Sub
升级
当代码升级后,Visual Basic.NET会建立一个新的升级工程。下
面通过几个例子来说明你的代码做了那些升级
Variant类型到Object类型
以前版本的Visual Basic支持Variant数据类型,该类型可以设
定为除了固定程度字符串外的任何原始数据类
型和Empty,Error,Nothing和Null。在Visual Basic.NET中,Object
数据类型可以设定为任何原始数据类型和Empty,
Error,Nothing,Null和对象指针。当你的工程升级到Visual
Basic.NET后,任何Variant定义都会改变为Object。
同样,当你在编辑器中插入代码时,Variant关键字也会被替换为
Object。
Integer数据类型到Short数据类型
在Visual Basic 6.0中,16bit数现在称为Short。32bit数称为
Integer(64bit数称为Long)。当工程升级后,
数据定义会做如下改动:
Dim x As Integer
dim y as Long
更改为:
Dim x As Short
dim y as Integer
属性语法
Visual Basic.NET对于自定义属性的语法作乐更加直观的更改,
将Get和Set合而为一。例如原来的属性如下:
Property Get MyProperty() As Integer
m_MyProperty = MyProperty
End Property
Property Let MyProperty(NewValue As Integer)
m_MyProperty = NewValue
End Property
升级后更改为:
Property MyProperty() As Short
Get
m_MyProperty = MyProperty
End Get
Set
m_MyProperty = Value
End Set
End Property
VB窗体到Windows窗体
Visual Basic.NET包含新的窗体包,Windows窗体,Windows窗体
包含内含菜单编辑器。你的VB窗体会升级到
Windows窗体。
界面
在先前的版本中,公用类界面对于用户总是隐藏的。在Visual
Basic.NET中,公用类可以在代码窗口中浏览和编辑。
升级报告及注释
当工程升级后,升级报告会添加到你的工程中,详细列出所有升
级后的你所需要对代码做的更改。同时代码中
会加入注释提示你注意任何潜在的问题。这些注释自动出现在
Visual Basic.NET的任务列表中。
VB.NET 的功能新特点:变量,类型,数组,属性方法
关 键 词: vb.net .NET 数组
在MSDN杂志2001年二月版中我写了一篇文章,介绍了新的Microsoft.NET架构和用Visual Basic .NET在这个平台下开发软件所要遵循的规则。在这篇文章中,我介绍了Microsoft彻底改造开发平台的动力以及对VisualBasiC语言做重大修改的根本原因。现在我介绍的东西将建立在这个话题的基础之上,所以我假定你已经读过VisualBasic.NET: New Programming Model and Language Enhancements Boost Development Power这篇文章,或者已经对.NET平台有了较深的理解.
我在二月份的文章中更多的是总体介绍了commonlanguage runtime(CLR),现在我将着重讨论VisualBasic .NET编程方面的新特点。一旦你学会如何运用这些新的特点,我肯定你也会认为VisualBasic .Net是比以前版本更好的工具。不过,我不可能在一个专栏中涉及所有的新特点,所以这个月的专栏将是一个系列的开端,这个专栏系列将持续几个月。
如果你以前经常使用Visual Basic的话,你会发现VisualBasic .Net有点熟悉,又有一点陌生。在可以利用许多以前就具备的技巧和知识的同时,仍然有很多东西要学。
许多公司花费了大笔的资金投资于Visual Basic6.0编写的软件,这些公司将面临如何处理这些已存在的软件的问题。我在介绍Visual Basic .NET新特点的同时,将会介绍影响把代码移植到Visual Basic .NET的关键所在。正如你将看到的,会有很多问题要考虑。随着编程语言变得更加一致、强大和友好,你会发现把Visual Basic 6.0项目改写成Visual Basic .NET项目需要很大的努力和技术。如果顺利的话,你将有幸在不远的将来从零开始编写一个VisualBasic .NET的项目。
新的便利:
我首先将介绍用一行代码实现声明并初始化变量的新语法。尽管许多初学者会认为这种语法是理所当然的,但实际上那些已习惯于在Visual Basic用两行代码来声明和初始化变量的程序员会对此感到很欣慰。
这儿是利用了Visual Basic .NET语法优势的三个例子:
Dim x As Integer = 10
Dim obj1 As Class1 = New Class1
Dim obj2 As New Class2
请注意,与前两行不一样,最后一行用的是在Visual Basic 6.0中合法的语法,它在Visual Basic .NET中同样是合法的。然而,值得注意的是,这儿的As New语句在Visual Basic .NET and Visual Basic 6.0中的处理是不同的,许多有经验的程序员反对使用As New语句,因为它将导致初始化的延迟,进而导致较低的执行效率,并给调试程序带来了许多困难。 好消息是As New语法在Visual Basic .NET中并不会造成初始化的延迟,因此不会导致相同的问题。在看前面的例子时,你应该注意第三行,它用了As New语句,但与前面几行具有一样的执行效率。当你在Visual Basic .NET中使用As New语句时,这个对象将在执行下一行之前被创建、初始化,并指派给你的变量。
这种方便的初始化语法也可以被用在类或结构的定义中。正如你想得那样,语法应该是这样的:
Class Class1
Private Field1 As Integer = 10
Public Field2 As Class1 = New Class1
End Class
另一点值得注意的是,当你在同一行声明几个变量时,他们应该是相同类型的变量,请看这个例子:
Dim x, y, z As Integer
三个变量都被声明成integer类型,你不再需要担心前两个变量偶然会被当作variant类型。实际上,你不用担心有什么变量会被当作variant类型处理,因为variant类型不再被CLR编程模型所支持。现在的通用类型是System.Object.
在Visual Basic .NET新增加的语法中,我最喜欢的一点是现在函数可以用Return来向它的调用者返回一个值。请看下面的例子:
Function MyFunction() As String
Return "This is my return value"
End Function
这个例子和用其他语言(比如C语言)一样,Return语句将结束函数的执行,并把控制权返回给调用者。我觉得使用Return语句与我们在VisualBasic的早期版本中的做法相比要方便得多。正如你记得的,在以前的版本中,要返回给调用者的值必须在函数的内部被赋给函数名。由于在VisualBasic .NET中使用了Return语句,你可以很容易地实现更改函数名或把代码从一个函数中复制、粘贴到另一个函数,而不需要搜索函数的内容并替换原来的函数名
消除矛盾
正如我在二月份的文章中提到的那样,在把一个对象指派给一个变量时,Visual Basic .NET既不需要,也不允许你用Set这个关键字。VisualBasic 6.0 和Visual Basic .NET的编译器有许多方面不一样,这就是其中之一。请看下面的代码:
Dim obj1, obj2, obj3, obj4 As Class1
obj1 = New Class1
obj2 = obj1
Set obj3 = New Class1
Set obj4 = obj3
第二行和第三行代码在Visual Basic .NET中是合法的。但在VisualBasic 6.0中编译时,它们将导致运行期错误。第四行和第五行的代码在VisualBasic 6.0中是合法的,但在Visual Basic .NET中却不能通过编译。正如你想象的,在把代码从VisualBasic 6.0移植到Visual Basic.NET时,需要特别注意对Set语句的改写。
在用Visual Basic .NET编写了六个多月的程序后,我发现自己仍然会使用Set语句,老习惯是不容易被改掉的。而且由于工作的关系,有好几次我得在同一天即用VisualBasic.NET,又用Visual Basic 6.0编写程序。不停地来回往复真地很困难。
在参数传递中括号的使用也发生了变化,这也给代码移植增加了困难。你们中的许多人在经过多年的编程之后已经习惯了调用函数和子程序的规则和特点。VisualBasic.NET小组觉得应该实现调用方法的一致性。
在Visual Basic. NET中,参数传递的规则很简单。当你调用一个函数或子程序并需要传递一个或多个参数时,必须用小括号把参数括起来。当调用一个不需要参数的函数或子程序时,小括号可以被省略。你不得不承认,与早期版本的VisualBasic中的规则相比,这些规则更直截了当,也更容易去学。
值得注意另一点是参数传递的默认方式也改变了。比如,当一个方法被定义成下面这种样式时,参数是如何被传给调用者的。
Sub Method1(Param1 As Integer)
' implementation
End Sub
在Visual Basic以前的版本中,Param1是引用传递的。也就是说在执行Method1时,改变这个integer类型的参数将导致调用者中相应的实际参数的值的改变。而在VisualBasic.NET中,默认的参数传递方式变成了值传递。也就是说执行Method1时,只是值被传递给了Param1,并且在Method1中改变Parame1的值不会改变调用者中相应的实际参数的值。很明显,在把VisualBasic 6.0中代码移植到Visual Basic.NET,这种参数传递默认方式的改变将破坏一些代码的语义。
请注意,在上一个例子中,被传递到参数的是一个值而不是地址。基本类型比如Byte,Integer,Double, and Boolean都是值类型。用户定义的枚举和结构类型也是值类型。在以值传递方式传递时,变量总是被复制。
当你传递的参数是基于类时,情况就不同了。基于类的参数是引用类型而不是值类型。它们被用来传递对象的引用。如果一个调用者传递了一个对象的引用给一个用了值传递方式的方法,在这个方法的实现中,对象的状态可能被改变。这种状态的改变将反映到调用者中。因此,无论你把参数声明成值传递还是引用传递,注意值类型还是引用类型之间的区别是很重要的。
尽管在方法中仍然可以使用可选参数,这仍是值得注意的地方。与VisualBasic 6.0不同,使用可选参数需要一个默认值。在同一行中,Visual Basic.NET不支持IsMissing函数,也就是说你区分不出一个省略了参数的调用和一个给参数传了默认值的调用。
如果你考虑在方法中使用可选参数,你应该考虑重载方法。一旦你知道了重载方法的好处和语法,你也许就会停止在方法中使用可选参数。
更高级别的类型保护
许多使用Visual Basic的开发者希望在每一个VisualBasic的源文件的开头能有一个Option Explicit语句。Option Explicit的应用可以区别对待真正的开发者和临时用户。和以前的版本不同,Visual Basic.NET缺省就使用Option Explicit。
在编译时默认使用Option Strict是Visual Basic.NET的另一个特点。使用了Option Strict后,缩小转换就被禁止了,因为它可能会导致数据或精度的丢失。请看下面的例子:
Dim x As Double
x = 20.1
Dim y As Integer
' implicit narrowing conversion
y = x ' doesn't compile under Option Strict
这段代码在Visual Basic 6.0可以被编译通过,但在Visual Basic.NET中,如果Option Strict语句被使用,它就不能被编译通过。Option Strict的使用使得程序员必须对应该使用何种类型很清楚。
Dim x As Double
x = 20.1
Dim y As Integer
' explicit narrowing conversion
y = CInt(x) ' compiles under Option Strict
另一个很大的变化是现在If语句被优化了。这代表了一个很有价值的最优化,而且现在当把代码移植到Visual Basic.NET时,理解这将如何影响基于Visual Basic 6.0的代码变得很重要。请看下面的代码:
If Function1() And Function2() Then
' statement block
End If
如果Function1返回了False值,那需要执行Function2以决定是否要执行IfThen中的代码吗?很明显这是不需要的。然而早期版本的Visual Basic并没有像这样优化If语句,在任何情况下Function2都将被执行。VisualBasic.NET实现了优化,因此当Function1返回值为False时,Function2不会被执行。这是另一个使得基于VisualBasic 6.0的代码不能在Visual Basic.NET中正确执行的因素。
现在我想谈谈这个语言中在类型安全方面的另一个改进。你应该注意到,如果Function1或Function2返回的值不是Boolean,那么前面的代码不能通过编译。由于类型安全的级别更高了,你不可以用integer类型的值进行条件测试了。比如下面的这段代码,在Visual Basic 6.0中是被经常使用的,但在Visual Basic.NET中却不能通过编译。
Dim x As Integer
' set x to 0 for false or anything else for true
If x Then
' execute statement block
End If
这种由Option Strict带来的新的类型安全级别使得你在使用If和Doloops语句时,必须使用Boolean类型的值,而不能用其它类型的值。
在使用诸如Not、 And、 Or、 Xor等的逻辑比较符时,你也被限制必须使用Boolean类型的值来输入输出。这与在以前版本的VisualBasic中这些比较符既可以用于逻辑比较又可以用于按位比较不同。下面这段代码在VisualBasic 6.0中能正常运行,但在Visual Basic .NET中却不能通过编译。
Dim x As Integer
Dim y As Integer
Dim z As Integer
x = 3
Y = 6
z = x And y ' doesn't compile
Visual Basic.NET提供了四种新的按位比较运算符:BitNot,BitAnd, BitOr, 和BitXor。这些运算符允许你在类型安全的方式下实行按位比较运算。比如,你可以用这些运算符中的一个对两个integer值的每一位来实现OR运算,还可以实现位掩码。下面是使用BitOr和BitAnd的一个例子:
Dim x As Integer = 3
Dim y As Integer = 6
Dim z As 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的数组。因此,OptionBase语句不再被VisualBasic .NET支持。
另外,你在声明一个数组时必须用它的元素个数,而不是它的上界来初始化。这儿是一个例子:
' declare an array with 3 elements from 0 to 2
Dim array1(3) As Integer
array1(0) = 2
array1(1) = 4
array1(2) = 8
上一段声明如果在Visual Basic 6.0中被使用,这个数组将有四个元素,下标从0到3。而在VisualBasic.NET中,这个数组有三个元素,下标从0到2。在VisualBasic .NET中,如果你的代码企图访问下标为3的数组元素,将引起运行期例外。比如:
' index out of range exception
array1(3) = 16
Visual Basic.NET为初始化数组提供了一种新的语法。你可以只用一行代码完成数组的声明和初始化。就像这样:
new array initialization syntax
Dim array1 As Integer() = {2, 4, 8}
'
在Visual Basic的早期版本中,你可以用For Each循环遍历一个数组。
Dim x As Integer
For Each x In array1
Console.WriteLine(x)
Next
同时,你也可以用For循环和数组长度来遍历一个数组。比如:
Dim i As Integer
For i = 0 To (array1.Length - 1)
Console.WriteLine(array1(i))
Next i
CLR 和Visual Basic.NET还支持多维数组。比如,当你想要一个二维数组时,你可以用下面三个技术中的一个来定义它:
Dim array1(2, 2) As Integer
Dim array2 As Integer(,)
Redim array2(2, 2)
Dim array3 As Integer(,) = { {12, 24}, {10, 20} }
使用数组时,你应该知道,不仅仅是语法变了,在运行时被处理的方式也发生了变化。在CLR中,数组被分配的地址空间总是在堆中。当你向一个方法传递数组类型的参数时,你使用的引用传递而不是值传递。
这儿是互相传递数组引用的三个方法:
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中参数被声明成了二维数组。
每一个数组对象继承了系统支持的类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块的属性构造器来定义。
下面是一个有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。VisualBasic.NET用这个内部变量向你在Set块中的属性实现传递了由客户制定的属性值。另外,在Visual Basic.NET中,程序员不再会有何时应使用Set属性,而何时应使用Let属性的困惑了。
一个属性一定是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关键字
索引属性和默认属性
一个属性可以被指定一个或多个索引。这可以使属性具有数组的特点。请看下面的类:
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)
如果把这个例子作进一步的改进,你可以把一个索引属性标记为类的默认属性。为了实现这一点,只要把Default关键字加到上一个例子中就可以了,就像这样:
Default Readonly Property Item(Index As Integer)…
一旦你为一个索引属性标记了Default关键字,客户端的代码就可以省略属性的名字而使用对象引用,就像使用一个数组一样。
Dim obj As New Class1
Dim s1 String
s1 = obj(0)
请注意,对于默认属性有一个重要的限制,即非索引属性不可以被标记为默认属性。这个限制在Visual Basic.NET中体现了出来,因为你不可以用Set语句来指定一个对象引用。既然Set语句不再被Visual Basic.NET所支持,那么非索引的默认属性将导致无法解决的多义性问题。
小结
正如你所见到的那样,在许多方面Visual Basic.NET都与它以前的版本不同。它具有更高的一致性和类型安全级别。另外,用Visual Basic.NET我们更容易写出控制性、可读性很高的代码。虽然它有时要求你习惯于那些编译时额外的检查,但它将在你测试和调试时,为你节约宝贵的时间。
好消息是Visual Basic已经被改成了一种更好、更强有力的语言。而坏消息是在Visual Basic 6.0下编写的软件需要做很多工作才可以被移植到Visual Basic.NET下。
在MSDN杂志2001年二月版中我写了一篇文章,介绍了新的Microsoft.NET架构和用Visual Basic .NET在这个平台下开发软件所要遵循的规则。在这篇文章中,我介绍了Microsoft彻底改造开发平台的动力以及对VisualBasiC语言做重大修改的根本原因。现在我介绍的东西将建立在这个话题的基础之上,所以我假定你已经读过VisualBasic.NET: New Programming Model and Language Enhancements Boost Development Power这篇文章,或者已经对.NET平台有了较深的理解.
我在二月份的文章中更多的是总体介绍了commonlanguage runtime(CLR),现在我将着重讨论VisualBasic .NET编程方面的新特点。一旦你学会如何运用这些新的特点,我肯定你也会认为VisualBasic .Net是比以前版本更好的工具。不过,我不可能在一个专栏中涉及所有的新特点,所以这个月的专栏将是一个系列的开端,这个专栏系列将持续几个月。
如果你以前经常使用Visual Basic的话,你会发现VisualBasic .Net有点熟悉,又有一点陌生。在可以利用许多以前就具备的技巧和知识的同时,仍然有很多东西要学。
许多公司花费了大笔的资金投资于Visual Basic6.0编写的软件,这些公司将面临如何处理这些已存在的软件的问题。我在介绍Visual Basic .NET新特点的同时,将会介绍影响把代码移植到Visual Basic .NET的关键所在。正如你将看到的,会有很多问题要考虑。随着编程语言变得更加一致、强大和友好,你会发现把Visual Basic 6.0项目改写成Visual Basic .NET项目需要很大的努力和技术。如果顺利的话,你将有幸在不远的将来从零开始编写一个VisualBasic .NET的项目。
新的便利:
我首先将介绍用一行代码实现声明并初始化变量的新语法。尽管许多初学者会认为这种语法是理所当然的,但实际上那些已习惯于在Visual Basic用两行代码来声明和初始化变量的程序员会对此感到很欣慰。
这儿是利用了Visual Basic .NET语法优势的三个例子:
Dim x As Integer = 10
Dim obj1 As Class1 = New Class1
Dim obj2 As New Class2
请注意,与前两行不一样,最后一行用的是在Visual Basic 6.0中合法的语法,它在Visual Basic .NET中同样是合法的。然而,值得注意的是,这儿的As New语句在Visual Basic .NET and Visual Basic 6.0中的处理是不同的,许多有经验的程序员反对使用As New语句,因为它将导致初始化的延迟,进而导致较低的执行效率,并给调试程序带来了许多困难。 好消息是As New语法在Visual Basic .NET中并不会造成初始化的延迟,因此不会导致相同的问题。在看前面的例子时,你应该注意第三行,它用了As New语句,但与前面几行具有一样的执行效率。当你在Visual Basic .NET中使用As New语句时,这个对象将在执行下一行之前被创建、初始化,并指派给你的变量。
这种方便的初始化语法也可以被用在类或结构的定义中。正如你想得那样,语法应该是这样的:
Class Class1
Private Field1 As Integer = 10
Public Field2 As Class1 = New Class1
End Class
另一点值得注意的是,当你在同一行声明几个变量时,他们应该是相同类型的变量,请看这个例子:
Dim x, y, z As Integer
三个变量都被声明成integer类型,你不再需要担心前两个变量偶然会被当作variant类型。实际上,你不用担心有什么变量会被当作variant类型处理,因为variant类型不再被CLR编程模型所支持。现在的通用类型是System.Object.
在Visual Basic .NET新增加的语法中,我最喜欢的一点是现在函数可以用Return来向它的调用者返回一个值。请看下面的例子:
Function MyFunction() As String
Return "This is my return value"
End Function
这个例子和用其他语言(比如C语言)一样,Return语句将结束函数的执行,并把控制权返回给调用者。我觉得使用Return语句与我们在VisualBasic的早期版本中的做法相比要方便得多。正如你记得的,在以前的版本中,要返回给调用者的值必须在函数的内部被赋给函数名。由于在VisualBasic .NET中使用了Return语句,你可以很容易地实现更改函数名或把代码从一个函数中复制、粘贴到另一个函数,而不需要搜索函数的内容并替换原来的函数名
消除矛盾
正如我在二月份的文章中提到的那样,在把一个对象指派给一个变量时,Visual Basic .NET既不需要,也不允许你用Set这个关键字。VisualBasic 6.0 和Visual Basic .NET的编译器有许多方面不一样,这就是其中之一。请看下面的代码:
Dim obj1, obj2, obj3, obj4 As Class1
obj1 = New Class1
obj2 = obj1
Set obj3 = New Class1
Set obj4 = obj3
第二行和第三行代码在Visual Basic .NET中是合法的。但在VisualBasic 6.0中编译时,它们将导致运行期错误。第四行和第五行的代码在VisualBasic 6.0中是合法的,但在Visual Basic .NET中却不能通过编译。正如你想象的,在把代码从VisualBasic 6.0移植到Visual Basic.NET时,需要特别注意对Set语句的改写。
在用Visual Basic .NET编写了六个多月的程序后,我发现自己仍然会使用Set语句,老习惯是不容易被改掉的。而且由于工作的关系,有好几次我得在同一天即用VisualBasic.NET,又用Visual Basic 6.0编写程序。不停地来回往复真地很困难。
在参数传递中括号的使用也发生了变化,这也给代码移植增加了困难。你们中的许多人在经过多年的编程之后已经习惯了调用函数和子程序的规则和特点。VisualBasic.NET小组觉得应该实现调用方法的一致性。
在Visual Basic. NET中,参数传递的规则很简单。当你调用一个函数或子程序并需要传递一个或多个参数时,必须用小括号把参数括起来。当调用一个不需要参数的函数或子程序时,小括号可以被省略。你不得不承认,与早期版本的VisualBasic中的规则相比,这些规则更直截了当,也更容易去学。
值得注意另一点是参数传递的默认方式也改变了。比如,当一个方法被定义成下面这种样式时,参数是如何被传给调用者的。
Sub Method1(Param1 As Integer)
' implementation
End Sub
在Visual Basic以前的版本中,Param1是引用传递的。也就是说在执行Method1时,改变这个integer类型的参数将导致调用者中相应的实际参数的值的改变。而在VisualBasic.NET中,默认的参数传递方式变成了值传递。也就是说执行Method1时,只是值被传递给了Param1,并且在Method1中改变Parame1的值不会改变调用者中相应的实际参数的值。很明显,在把VisualBasic 6.0中代码移植到Visual Basic.NET,这种参数传递默认方式的改变将破坏一些代码的语义。
请注意,在上一个例子中,被传递到参数的是一个值而不是地址。基本类型比如Byte,Integer,Double, and Boolean都是值类型。用户定义的枚举和结构类型也是值类型。在以值传递方式传递时,变量总是被复制。
当你传递的参数是基于类时,情况就不同了。基于类的参数是引用类型而不是值类型。它们被用来传递对象的引用。如果一个调用者传递了一个对象的引用给一个用了值传递方式的方法,在这个方法的实现中,对象的状态可能被改变。这种状态的改变将反映到调用者中。因此,无论你把参数声明成值传递还是引用传递,注意值类型还是引用类型之间的区别是很重要的。
尽管在方法中仍然可以使用可选参数,这仍是值得注意的地方。与VisualBasic 6.0不同,使用可选参数需要一个默认值。在同一行中,Visual Basic.NET不支持IsMissing函数,也就是说你区分不出一个省略了参数的调用和一个给参数传了默认值的调用。
如果你考虑在方法中使用可选参数,你应该考虑重载方法。一旦你知道了重载方法的好处和语法,你也许就会停止在方法中使用可选参数。
更高级别的类型保护
许多使用Visual Basic的开发者希望在每一个VisualBasic的源文件的开头能有一个Option Explicit语句。Option Explicit的应用可以区别对待真正的开发者和临时用户。和以前的版本不同,Visual Basic.NET缺省就使用Option Explicit。
在编译时默认使用Option Strict是Visual Basic.NET的另一个特点。使用了Option Strict后,缩小转换就被禁止了,因为它可能会导致数据或精度的丢失。请看下面的例子:
Dim x As Double
x = 20.1
Dim y As Integer
' implicit narrowing conversion
y = x ' doesn't compile under Option Strict
这段代码在Visual Basic 6.0可以被编译通过,但在Visual Basic.NET中,如果Option Strict语句被使用,它就不能被编译通过。Option Strict的使用使得程序员必须对应该使用何种类型很清楚。
Dim x As Double
x = 20.1
Dim y As Integer
' explicit narrowing conversion
y = CInt(x) ' compiles under Option Strict
另一个很大的变化是现在If语句被优化了。这代表了一个很有价值的最优化,而且现在当把代码移植到Visual Basic.NET时,理解这将如何影响基于Visual Basic 6.0的代码变得很重要。请看下面的代码:
If Function1() And Function2() Then
' statement block
End If
如果Function1返回了False值,那需要执行Function2以决定是否要执行IfThen中的代码吗?很明显这是不需要的。然而早期版本的Visual Basic并没有像这样优化If语句,在任何情况下Function2都将被执行。VisualBasic.NET实现了优化,因此当Function1返回值为False时,Function2不会被执行。这是另一个使得基于VisualBasic 6.0的代码不能在Visual Basic.NET中正确执行的因素。
现在我想谈谈这个语言中在类型安全方面的另一个改进。你应该注意到,如果Function1或Function2返回的值不是Boolean,那么前面的代码不能通过编译。由于类型安全的级别更高了,你不可以用integer类型的值进行条件测试了。比如下面的这段代码,在Visual Basic 6.0中是被经常使用的,但在Visual Basic.NET中却不能通过编译。
Dim x As Integer
' set x to 0 for false or anything else for true
If x Then
' execute statement block
End If
这种由Option Strict带来的新的类型安全级别使得你在使用If和Doloops语句时,必须使用Boolean类型的值,而不能用其它类型的值。
在使用诸如Not、 And、 Or、 Xor等的逻辑比较符时,你也被限制必须使用Boolean类型的值来输入输出。这与在以前版本的VisualBasic中这些比较符既可以用于逻辑比较又可以用于按位比较不同。下面这段代码在VisualBasic 6.0中能正常运行,但在Visual Basic .NET中却不能通过编译。
Dim x As Integer
Dim y As Integer
Dim z As Integer
x = 3
Y = 6
z = x And y ' doesn't compile
Visual Basic.NET提供了四种新的按位比较运算符:BitNot,BitAnd, BitOr, 和BitXor。这些运算符允许你在类型安全的方式下实行按位比较运算。比如,你可以用这些运算符中的一个对两个integer值的每一位来实现OR运算,还可以实现位掩码。下面是使用BitOr和BitAnd的一个例子:
Dim x As Integer = 3
Dim y As Integer = 6
Dim z As 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的数组。因此,OptionBase语句不再被VisualBasic .NET支持。
另外,你在声明一个数组时必须用它的元素个数,而不是它的上界来初始化。这儿是一个例子:
' declare an array with 3 elements from 0 to 2
Dim array1(3) As Integer
array1(0) = 2
array1(1) = 4
array1(2) = 8
上一段声明如果在Visual Basic 6.0中被使用,这个数组将有四个元素,下标从0到3。而在VisualBasic.NET中,这个数组有三个元素,下标从0到2。在VisualBasic .NET中,如果你的代码企图访问下标为3的数组元素,将引起运行期例外。比如:
' index out of range exception
array1(3) = 16
Visual Basic.NET为初始化数组提供了一种新的语法。你可以只用一行代码完成数组的声明和初始化。就像这样:
new array initialization syntax
Dim array1 As Integer() = {2, 4, 8}
'
在Visual Basic的早期版本中,你可以用For Each循环遍历一个数组。
Dim x As Integer
For Each x In array1
Console.WriteLine(x)
Next
同时,你也可以用For循环和数组长度来遍历一个数组。比如:
Dim i As Integer
For i = 0 To (array1.Length - 1)
Console.WriteLine(array1(i))
Next i
CLR 和Visual Basic.NET还支持多维数组。比如,当你想要一个二维数组时,你可以用下面三个技术中的一个来定义它:
Dim array1(2, 2) As Integer
Dim array2 As Integer(,)
Redim array2(2, 2)
Dim array3 As Integer(,) = { {12, 24}, {10, 20} }
使用数组时,你应该知道,不仅仅是语法变了,在运行时被处理的方式也发生了变化。在CLR中,数组被分配的地址空间总是在堆中。当你向一个方法传递数组类型的参数时,你使用的引用传递而不是值传递。
这儿是互相传递数组引用的三个方法:
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中参数被声明成了二维数组。
每一个数组对象继承了系统支持的类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块的属性构造器来定义。
下面是一个有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。VisualBasic.NET用这个内部变量向你在Set块中的属性实现传递了由客户制定的属性值。另外,在Visual Basic.NET中,程序员不再会有何时应使用Set属性,而何时应使用Let属性的困惑了。
一个属性一定是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关键字
索引属性和默认属性
一个属性可以被指定一个或多个索引。这可以使属性具有数组的特点。请看下面的类:
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)
如果把这个例子作进一步的改进,你可以把一个索引属性标记为类的默认属性。为了实现这一点,只要把Default关键字加到上一个例子中就可以了,就像这样:
Default Readonly Property Item(Index As Integer)…
一旦你为一个索引属性标记了Default关键字,客户端的代码就可以省略属性的名字而使用对象引用,就像使用一个数组一样。
Dim obj As New Class1
Dim s1 String
s1 = obj(0)
请注意,对于默认属性有一个重要的限制,即非索引属性不可以被标记为默认属性。这个限制在Visual Basic.NET中体现了出来,因为你不可以用Set语句来指定一个对象引用。既然Set语句不再被Visual Basic.NET所支持,那么非索引的默认属性将导致无法解决的多义性问题。
小结
正如你所见到的那样,在许多方面Visual Basic.NET都与它以前的版本不同。它具有更高的一致性和类型安全级别。另外,用Visual Basic.NET我们更容易写出控制性、可读性很高的代码。虽然它有时要求你习惯于那些编译时额外的检查,但它将在你测试和调试时,为你节约宝贵的时间。
好消息是Visual Basic已经被改成了一种更好、更强有力的语言。而坏消息是在Visual Basic 6.0下编写的软件需要做很多工作才可以被移植到Visual Basic.NET下。
选择学习VB.Net还是学习C#
关 键 词: vb.net .NET
面向对象的程序设计不可避免的将会出现在.Net的世界里。现在问题是,我们要选择哪一种语言呢?
(飞刀前言:如果您是VB程序员,那么本文将会为您介绍VB.NET与以前版本VB的区别,如果您是C#、C++,C,Java程序员,本文最好不要看,此文的作者的某些观点会让我们这些程序员吐血)
在VB.NET中,微软给与了VB程序员们多年来梦寐以求的东东,也就是真正的面向对象的程序设计语言。也许您已经听说了,VB.Net与他的前身VB有很大的不同,甚至您都不会认识它了。确实,他们不得不删除了一些细小的东东,同时改变了一些对象,属性以及方法,但是这些对一个VB程序员来说都不是什么大问题。实际上,我认为一旦您已经能够熟练的使用VB.Net,您会发现它比以前的VB版本更加简单和直观。因为在学习VB.NET的路上要走不少的弯路,所以我想您可能会对C#产生好奇心,盘算着是否需要放弃VB。
如果您现在已经是一个VB程序员了,而且已经有一定时间了,那么您并不需要去选择其它的语言,比如C#或Delphi。你会发现VB尽管已经的改变了不少,但是它的核心依在。最主要的变化存在于使用VB.NET中的对象、属性以及方法。不论您学习哪样.Net程序,这些都是需要重新学习的。
如果您从Dos时代便开始使用BASIC语言,那么VB.Net将会让你承受不小的打击。VB.NET已经去掉了GoSub,While/Wend以及其它一些陈旧的语句。但是微软已经发出警告,在任何情况下都不要使用非结构性语句。
VB.NET 的优势
VB.Net 拥有features,而C#没有。比如,IsDBNull()函数就只存在于VB.NET,C#中是不没有的。
VB.NET拥有求幂函数以及重新分配数组空间的Redim ,这些C#中也没有。C#对大小写很敏感,而大多数的VB程序并不习惯于区分大小写。以我个人来说,我喜欢VB中的If ....End If 以及Do ...Loop的方式,而不太喜欢C#中{}符号。Select Case语句也比C#中的switch语句更加简单和紧凑。在C#中,你不得不使用break语句去中止查询结构。在VB中,你能使用Case 1 to 50,但是在C#中你不得不使用50个独立的case语句来完成。
当你在使用VB中面象对象的特性时,你会发现Inherits,MoustInherit,NotInheritable,Overridable以及其它一些关键字。在C#中,这样的特性您不得不调用一些模糊的关键字和语法,比如在VB.NET中,继承一个类,你可以这样写:
Public Class Person
...
End Class
Public Class Employee
Inherits Person
...
End Class
如果使用C#就必须:
public class Person
{
public Person() {
...
}
}
public class Employee : Person
{
public Employee() {
...
}
}
如果你不仔细,您可能会忘记使用Employee : Person语法来继承Person类。
(飞刀注:此作者为典型的VB程序员,呵呵,没有想到飞刀认为的C#的优点,全被此作者否定。在这些上面飞刀的个人观点与这位作者不同,其实只要大家习惯,就会发现C#是多么的好用。如果大家是从VB转到C#,那么肯定会有一些不适应,但是也没有到全盘否定的地步,呵呵,习惯就好)
升级至VB.NET有多大困难?
从VB6.0移植至VB.NET,并非没有挑战必。但是这里有些事情,我们必须事先准备好:第一,使用类,COM组件,以及递行排列的开发技术。如果您使用这些程序开发构造,您的移植工作将会很简单。这里有些程序样式并不是很容易移植的,比如非零数组,隐含变量(即没有使用Option Explicit),以及Jet或者RDO。
介绍C#
微软在创建C#时有两种思想:第一,需要一个Java的竞争者,微软需要一个绝对属于本公司的类似于Java的语言。另外就是,微软希望有一个全新的,整洁的语言。
C#适合于那些Java、C以及C++程序员,这些程序员已经很习惯于这种语言的结构以及对大小写敏感的特性。他们也不得不重头学习.Net的类库,因此在这时们并不比VB程序员有多少优势。
C#的优势
我无可否认,是一名VB的支持者,但是C#确实存在一些优势,比如多行注释,以及一些代码的简写:
intValue--
intValue-
其它一些C#的优点就是在Beta版文档中,C#的资料比VB多。
尽管不会经常用于编写商业应用程序,但是C#还是支持指针。在这个方面C#确实比VB有着一些小小的优势。但是,在我的程序中,我很少使用指针。
(飞刀注:可能是我翻译有错误,pointer是否表示指针,如果是,这位作者已经犯下一个天大的错误,那就是C#中并不支持指针,而且不知道这位作者是否使用过VC#,怎么能说C#不经常编写商业应用程序?)
C#拥有使用Unsigned数据类型的能力,同样的,在商业应用程序中它的使用并不广泛。
移植之路
从VB6.移植至VB.NET的道路并不平坦,但是我想对于想学好一门新程序语言的您来说,这份投资是值得的。在学习中,我推荐您学习面像对象的程序方式。你会经常在.Net的编程世界中经常使用到它。
(飞刀总结:因为作者是一位优秀的VB程序,可能对C#并不是十分了解,对于C#他基本是否定的,他所说的有些观点,飞刀可以肯定地告诉大家,那是错误的,但是作者对于VB.NET的分析还是非常有用处的)
面向对象的程序设计不可避免的将会出现在.Net的世界里。现在问题是,我们要选择哪一种语言呢?
(飞刀前言:如果您是VB程序员,那么本文将会为您介绍VB.NET与以前版本VB的区别,如果您是C#、C++,C,Java程序员,本文最好不要看,此文的作者的某些观点会让我们这些程序员吐血)
在VB.NET中,微软给与了VB程序员们多年来梦寐以求的东东,也就是真正的面向对象的程序设计语言。也许您已经听说了,VB.Net与他的前身VB有很大的不同,甚至您都不会认识它了。确实,他们不得不删除了一些细小的东东,同时改变了一些对象,属性以及方法,但是这些对一个VB程序员来说都不是什么大问题。实际上,我认为一旦您已经能够熟练的使用VB.Net,您会发现它比以前的VB版本更加简单和直观。因为在学习VB.NET的路上要走不少的弯路,所以我想您可能会对C#产生好奇心,盘算着是否需要放弃VB。
如果您现在已经是一个VB程序员了,而且已经有一定时间了,那么您并不需要去选择其它的语言,比如C#或Delphi。你会发现VB尽管已经的改变了不少,但是它的核心依在。最主要的变化存在于使用VB.NET中的对象、属性以及方法。不论您学习哪样.Net程序,这些都是需要重新学习的。
如果您从Dos时代便开始使用BASIC语言,那么VB.Net将会让你承受不小的打击。VB.NET已经去掉了GoSub,While/Wend以及其它一些陈旧的语句。但是微软已经发出警告,在任何情况下都不要使用非结构性语句。
VB.NET 的优势
VB.Net 拥有features,而C#没有。比如,IsDBNull()函数就只存在于VB.NET,C#中是不没有的。
VB.NET拥有求幂函数以及重新分配数组空间的Redim ,这些C#中也没有。C#对大小写很敏感,而大多数的VB程序并不习惯于区分大小写。以我个人来说,我喜欢VB中的If ....End If 以及Do ...Loop的方式,而不太喜欢C#中{}符号。Select Case语句也比C#中的switch语句更加简单和紧凑。在C#中,你不得不使用break语句去中止查询结构。在VB中,你能使用Case 1 to 50,但是在C#中你不得不使用50个独立的case语句来完成。
当你在使用VB中面象对象的特性时,你会发现Inherits,MoustInherit,NotInheritable,Overridable以及其它一些关键字。在C#中,这样的特性您不得不调用一些模糊的关键字和语法,比如在VB.NET中,继承一个类,你可以这样写:
Public Class Person
...
End Class
Public Class Employee
Inherits Person
...
End Class
如果使用C#就必须:
public class Person
{
public Person() {
...
}
}
public class Employee : Person
{
public Employee() {
...
}
}
如果你不仔细,您可能会忘记使用Employee : Person语法来继承Person类。
(飞刀注:此作者为典型的VB程序员,呵呵,没有想到飞刀认为的C#的优点,全被此作者否定。在这些上面飞刀的个人观点与这位作者不同,其实只要大家习惯,就会发现C#是多么的好用。如果大家是从VB转到C#,那么肯定会有一些不适应,但是也没有到全盘否定的地步,呵呵,习惯就好)
升级至VB.NET有多大困难?
从VB6.0移植至VB.NET,并非没有挑战必。但是这里有些事情,我们必须事先准备好:第一,使用类,COM组件,以及递行排列的开发技术。如果您使用这些程序开发构造,您的移植工作将会很简单。这里有些程序样式并不是很容易移植的,比如非零数组,隐含变量(即没有使用Option Explicit),以及Jet或者RDO。
介绍C#
微软在创建C#时有两种思想:第一,需要一个Java的竞争者,微软需要一个绝对属于本公司的类似于Java的语言。另外就是,微软希望有一个全新的,整洁的语言。
C#适合于那些Java、C以及C++程序员,这些程序员已经很习惯于这种语言的结构以及对大小写敏感的特性。他们也不得不重头学习.Net的类库,因此在这时们并不比VB程序员有多少优势。
C#的优势
我无可否认,是一名VB的支持者,但是C#确实存在一些优势,比如多行注释,以及一些代码的简写:
intValue--
intValue-
其它一些C#的优点就是在Beta版文档中,C#的资料比VB多。
尽管不会经常用于编写商业应用程序,但是C#还是支持指针。在这个方面C#确实比VB有着一些小小的优势。但是,在我的程序中,我很少使用指针。
(飞刀注:可能是我翻译有错误,pointer是否表示指针,如果是,这位作者已经犯下一个天大的错误,那就是C#中并不支持指针,而且不知道这位作者是否使用过VC#,怎么能说C#不经常编写商业应用程序?)
C#拥有使用Unsigned数据类型的能力,同样的,在商业应用程序中它的使用并不广泛。
移植之路
从VB6.移植至VB.NET的道路并不平坦,但是我想对于想学好一门新程序语言的您来说,这份投资是值得的。在学习中,我推荐您学习面像对象的程序方式。你会经常在.Net的编程世界中经常使用到它。
(飞刀总结:因为作者是一位优秀的VB程序,可能对C#并不是十分了解,对于C#他基本是否定的,他所说的有些观点,飞刀可以肯定地告诉大家,那是错误的,但是作者对于VB.NET的分析还是非常有用处的)
谈论VB.NET架构
新闻简介: 微软公司提出的.NET概念,正从各个方面渗入到我们的生活中。它将产生的作用,诚如一位业内名家所描述的:“请忘掉你认为你所知道的,.NET将改变一切”!既然如此,无论是IT业内人士、还是企业决策者,快速领会这个新概念的含义及深远影响,都显得非常必要。
概要
VB正在不断地发展中,它具备了以前VB编程人员作梦都想拥有的性能,想象一下你将随心所欲的利用这些性能,是不是很令人激动?然而,这个计划于2001年第
关 键 词: vb.net .NET
微软公司提出的.NET概念,正从各个方面渗入到我们的生活中。它将产生的作用,诚如一位业内名家所描述的:“请忘掉你认为你所知道的,.NET将改变一切”!既然如此,无论是IT业内人士、还是企业决策者,快速领会这个新概念的含义及深远影响,都显得非常必要。
概要
VB正在不断地发展中,它具备了以前VB编程人员作梦都想拥有的性能,想象一下你将随心所欲的利用这些性能,是不是很令人激动?然而,这个计划于2001年第四季度上市销售的VB版本可能会给你带来些小麻烦,因为要完全掌握它需要一个较长的学习周期,而且其中包括了一些微妙的变化,你可能在使用他们的时候出现错误。
需要准备的条件:建议获得Visual Basic.NET beta 版,这些内容对所有VB程序员都是有用的。
Microsoft .NET平台的涵盖面很广,而且很难预测它的真正意义。我们注意到,现在有很多关于.NET的不正确的理解。因此在这篇文章里,我们将把给你一个VB.NET到底是些什么的概念,从头到尾说一说它是什么、它能干什么以及怎样才能充分发挥它的优点。我们要特别地细看一下IDE的改变、面向对象特征、底层结构的改变、一些“现代化”的语法以及包装和分发方面的增强。我们将讨论这些功能能为你做什么,解释他们的优点与不足。由于这些改变是如此之大,而且涉及方方面面,因此希望这一篇文章能满足你全部的要求是不现实的,要了解这方面全部的知识请参阅有关文章和书籍。
Visual Basic.NET 和你现在所知的开发工具完全不同,并且这个新版本会改变你的未来。到底有多大不同?如果你觉得从VB3迁移到VB4是一个很大的变化,那这次VB.NET会让你感到震惊。这次升级与其说是VB的一个新版本,还不如说是迁移到一个新平台上,你所面临的情况就和从DOS迁移到Windows差不多。
VB获得了继承能力
VB.NET预期拥有的第一新功能就是继承能力。继承是VB开发者长期以来要求得最多的功能。判断一下对继承的要求是不是像早些时候对本地化编译器的要求一样将是一件很有意思的事,后者,当Microsoft提供了一个以后,你就几乎听不到多少这方面的言语了。
Visual Basic现在是真正的面向对象语言了。过去,你可以通过使用VB的界面继承性创建伪实现的对象继承,但现在不必这样做了。
Visual Basic.NET 现在提供大量面向对象功能,包括应用程序继承,它允许你从其它类导出你想创建的类。像在其它面向对象语言里一样,你能覆盖基类的方法和属性,并且能实现多态以创建健壮的、扩展性好的组件。例如,假定你从基类 Crane里继承产生了一个ForkLift类,你能使用像下面的代码覆盖基类里对Lift方法的默认实现:
Public Class ForkLift
Inherits Crane
Overrides Sub Lift(ByRef _
Height As Double)
Height = Height + 10
End Sub
End Class
VB.NET不仅能让你覆盖方法或属性;它还能让你重载方法。重载是定义同名、但使用不同数据类型的方法或属性的能力。例如,假定你有一个组件能对不同数据类型的数组进行排序,你不需要三个(每种数据类型一个)不同名的方法;实际上你可以重载一个方法名:
Overloads Sub SortArray(ByRef _
aValues()As String)
...
Overloads Sub SortArray(ByRef _
aValues() As Integer)
...
Overloads Sub SortArray(ByRef _
aValues() As Object)
一个改变是:表单现在是类模块。这就是说类本身包含建立表单的所有“肥料”的代码。你可能想知道,为什么你不得不看到这些从前不用看的代码,但这个改变同时带来强大的新功能,包括继承这些表单的能力。Microsoft把这一技术称为可视化继承。假定你的对话框有一种标准的格式,例如在表单的一侧有一行按钮,并在角上有一个标识,那么,通过可视化继承你能创建一个表单模板(类),并从这个基类里导出所需的表单。
一切都是对象
代码复用简化了开发过程,像实现和可视化继承这样的功能有利于更简单、更强大的代码复用。然而,代码复用并不是到此为止。你能通过支持VB.NET的通用语言运行库(Common Language Runtime - CLR)继承在其它 VS.NET 语言里定义的类。例如,你或别人创建了一个 C# 类,然后就能从 VB 里继承它。
VB.NET 的面向对象能力扩展了语言本身的通路:一切都是对象。这意味着比在以前的 VB 版本里,你获得了更多的内在功能,你将很少被迫使用 Windows API。例如,在以前的 VB 版本里,你使用 LoadPicture 方法加载图片并使用表单的 Line 方法(或较快的 API) 画线。现在,你使用 System.Drawing 对象来创建并处理图形。你可以使用以下代码在表单上显示一幅图片:
picshowpicture.Image = _
system.Drawing.Image.FromFile( _
"c:\test.bmp")
注意 VB.NET 的“一切都是对象”方式让你的语句能用得更长久。
考虑以下语句,它在一个图形对象上画一条黄绿色的线:
objgraphics.DrawLine(system.Drawing. _
Pens.Chartreuse, 0, 0, 100, 100)
这些长长的语句也有好处:改进的功能、适应性和易用性。从前,你要实现先进的功能就不得不在文档中挖掘,经常是不得不诉诸API。现在,相关的功能集符合逻辑地包含在对象里。这种处理方式的另外一个好处就是:类把相关的功能很好的组织了起来。所以,浏览你感兴趣的对象,发现它们做些什么实际上很有意思。
Visual Basic.NET 的面向对象功能提供了很多实在的好处。很多情况下,VB.NET 面向对象的本质和实现的继承性能帮助你比在以前的 VB 版本里更容易、更迅速地创建特定类型的功能。然而,你不一定要仅仅因为你能做到,就使用实现继承性或其它 .NET 功能。VB.NET 的新功能使开发许多类型的应用程序变得更简单!但是,就像使用所有的语言能力一样,你需要使用的是在特定场合下最适合的功能。
自由线程的危险
对于自由线程可能需要特别给出警告。VB6允许你使用独立的线程来创建多线程服务器程序,但VB过去从来没有让你能创建自由线程的客户端程序。VB.NET 改变了这一切。现在,创建自由线程应用程序几乎成了最微不足道的事情。实际上,我估计那些没有理解其中的微妙差别,就在他们的应用程序里添加了自由线程的程序员会遇到很多问题。只需要几行代码就能启动一个新线程:简单地将线索对象的地址传递给方法,方法本身就会启动线程。这确实是很酷也很有用的东西,但你需要小心:这些功能适用于特定的场合,确定哪些是适用的场合并且明智的使用这些工具则是你自己的事。许多开发者使用继承性和自由线程时给自己找了不少麻烦,请不要让这些发生在你身上。
可能大家讨论得最多的 VB.NET 特征就是 CLR (通用语言运行库),VB 运行在它的顶层上。是 CLR 提供了 VB.NET 的许多关键功能。例如,CLR 使实现和跨语言继承性以及自由线程成为可能。
分发VB程序要求你同时分发VB的运行库,在VB6里即是msVBvm60.dll。许多其它语言也有类似的要求,包括 C++ 和 Java。在Visual Studio.NET里,所有的Visual Studio语言共享同一个运行库:CLR。这里有几个较大的变化,首先,所有的Visual Studio语言现在都共享同一个IDE、同样的表单引擎、同样的异常处理机制等等。这意味着Visual Basic和像 C#这样的语言拥有同等的地位,至少差不多是同等的。
易于反编译的中间语言
无论你用VB、C#或其它.NET语言编写应用程序,VS.NET代码都编译成为中间语言(IL)。当应用程序运行时,一个即时编译器(JITter)处理IL代码并把它编译成为机器语言。这意味着在理论上可能为Windows以外的平台创建.NET运行库,但现在关于类似的事情还没有任何官方消息。中间语言的一个缺陷是:它像VB5以前的VB版本一样,容易被反编译。这种可能性使许多开发者普遍地质疑.NET架构的安全性。
CLR在IL层次内外影响代码,对它的修改将使所有使用CLR的语言受益。然而,语言只是和代码如何被解释为IL有关,对特定语言的优化可以根据特定语言的语法来编写,这样在技术上就可能使.NET语言之间的性能差别很小。不管怎样,大体上蓝图是美好的。例如,CLR使VB的调试和监测工具和C#的相应工具相当,它做到了这一点因为它们本来就是相同的工具。
CLR提供不平行的跨语言集成,包括跨语言继承代码的能力。所有使用CLR的语言共享一个通用类型系统,它使使用多种语言开发应用程序变得更简单。我不喜欢把 C API 声明翻译成VB里可以使用的形式,所以我很赞赏通用类型系统带来的好处。
在CLR中运行的代码被称为被管理代码,被管理代码使用的内存完全由CLR来控制。被管理代码带来很多好处,包括跨语言集成、跨语言异常处理和简化的部件相互作用模型。Visual Basic被限制为只能以被管理代码的方式工作,然而C#拥有跳到非被管理代码的能力(执行到运行库之外),并能做像指针操作这类事情。这是VB和C#不同等的情况之一。这种能力到底有多重要取决于你想干什么。
CLR造成的体系结构差别要比跨语言集成、共享功能和被管理代码等深刻。首先,Visual Studio.NET的支撑结构不是 COM。另外,VB.NET里的所有东西,甚至字符串都是对象。因为这些和其它一些原因,Microsoft改变了支撑结构处理对象的方式。COM实现了一个引用计数方案,这样每次引用一个对象时,计数器递增。当一个对象引用超出作用域或被释放时,计数器递减,当引用计数减少到零时就终止这个对象。Microsoft声称在.NET架构下引用计数的开销太大,以至于不能在 .NET中实现它,所以它放弃了引用计数转而使用垃圾收集。
垃圾收集需要新体系结构
CLR垃圾收集器主要是监视一个程序的资源,当可用资源达到确定的阈值时寻找无用的对象,并在发现它们的时候清除这些对象。垃圾收集的一大好处就是你不再需要担心大多数普通的循环引用,即子对象引用了父对象,然后父对象又引用了子对象。在引用计数方案下,循环引用使两个对象都不能被释放和清除。然而,垃圾收集器会发现循环引用并清除它们。这也意味着释放对象的最后一个引用时不再需要立即清除对象。
垃圾收集的一个后果是:你再也不能指望一个类的 Terminate 事件能在适当的时机发出。实际上,如果线程被阻塞,可能根本就不会发出 Terminate 事件。和COM提供的确定化终止相反,它被称为不确定的终止。缺乏确定化终止,以及因为垃圾收集器重新安排并压缩内存从而不能使用指针的事实,在新闻组里激发了一波激烈的辩论。我想这些新限制可能会令你痛恨,因为你要依靠确定化终止;也可能你漠不关心,因为你不依赖 Terminate 事件。垃圾收集并不是万灵药,实现弱引用依然需要做一些考虑。
从引用计数到垃圾收集只是 Visual Studio.NET 的支撑结构不是 COM 这个事实的表象之一。你能在VB.NET中使用COM对象,比如说ActiveX服务器或ActiveX控件。然而,你必须通过包装访问这些对象。任何时候听到“包装”这个术语,你应该明白你面对着性能损失,并且对象的行为可能有所不同。如果当计划移植一个使用了大量COM对象的工程,就需要认真地测试和计划,可能需要重新规划应用程序的结构才能移植成功。坦率地说,你要有遭受挫折的准备。还记得从VBX迁移到 OCX的过程吗?我记得,我的精神病医生也记得。我很快就要再去看他了 ;-)
语言本身的变化要远远超过体系结构的变化。大部分改变确有道理,但我并不认为所有的改变都是如此。以前版本的VB允许你以很多方法来做很多事,以至于统一的编码标准要么不存在要么就很难强加于人。Microsoft对VB做了大量的改变为的就是“清晰”这种语言。很多情况下,原来你有好几种方法做一件事,现在就只有一种了。Billy Hollis 提供了语法变化的详细列表,包括废弃的关键字列表,但有些东西需要在这里重复一下。
首先,向过程参数传递数据的默认方法由引用(ByRef)变成了传值(ByVal)。这个改变主要是因为引用要比传值的风险大得多。它的风险主要是调用过程中的数据可能被无意中篡改。你仍然能通过引用传递数据,但这一改变使你需要修改新的默认调用方法来使用引用。
Set语句消失了
其次,Set 语句消失了。在 VB.NET 里如果你需要向变量传递一个对象引用,所需要的只是一个等号,对象被视为同其它值一样。这很酷,但也有副作用:默认属性消失了。例如,你不再能用这种方式引用一个属性:
Text1 = "What, me worry?"
作为替代,你必须显式地引用属性:
Text1.Text = "What, me worry?"
也许一眼看来不需要这种改变,但确实必须去掉默认属性。例如,假定你有一个叫objFoo的对象变量,不用Set语句,下面的语句所设置的引用就产生了歧义性:
objFoo = Text1
这条语句是应该设置到Text1的引用,还是以Text1的Text属性来填充objFoo?你不能确定,编译器也不能。抛弃Set语句同时要求抛弃默认属性。
有一个改变我不喜欢:你不再能在不同的作用域里声明Property Get和Property Set过程。注意 VB.NET 没有 Property Let 语句:对象和数值都用 Property Set。这意味着你不能用一个 Friend Property Let 过程来对应一个 Public Property Get。用VB建立组件时可能会有麻烦。许多组件开发者创建 Friend Property Set 过程以使他们的应用程序能改变一个值,但提供 Public Property Get 过程以使他们的客户程序能取回值。我希望我能为这个改变找到一个合适的理由,可是我找不到。
Microsoft说它力图使语言保持清晰并使之现代化—大部分情况下它做得不错—但这个作用域问题和其它几个问题令人感到困惑。例如,While...Wend 很早以前就应该消失了,因为 Do...Loop 完成同样的功能。然而,Microsoft 不仅没能去掉 While...Wend,还把它改成了 While...End While 来给自己找了更多的麻烦。真奇怪!
我最不喜欢的改变是:Microsoft改变了你已经使用的数据类型含义。在 .NET 里,Integer 现在是 32 位,而 Long 变成了 64 位。我心存恐惧地想:开发者 (包括我自己) 会多么频繁地使用错误的变量啊。那个API到底是接受一个16位的 Integer还是32位的?老天!我希望Microsoft重新考虑这个决定并使用新的变量类型,比如Int32和Long64。无论迁移到 VB.NET的移植工具是多么的好,它也不能改变开发者的记忆。为什么要逼着我们再学一遍普通的数据类型呢?
最后,最需要的一个改变是:VB.NET引入了 Option Strict 关键字,你可以使用它来代替 Option Explicit。Option Strict 结束了万恶的类型强制(tm),通过它VB乐于让你把一个数值赋值给一个字符串,然后像犯罪一样做另一个操作。设置 Option Strict 告诉 Visual Basic.NET 不要为你做任何类型强制。注意 VB.NET 并不是彻底的控制狂,它允许类型向下转换,但不允许向上。例如,不使用像 sngvariable = CSng(dblvariable) 这样的语句进行显式类型转换,你就不能把声明为 Single 的变量赋值给声明为 Double 的变量。因为这有丢失数据的风险。然而,你能不使用显式类型转换就把声明为 Double 的变量赋值给声明为 Single 的变量,因为这并没有丢失数据的危险。使用 Option Strict 能帮助开发者减少很多类型错误,包括那些很难调错的。但有一个附加的缺陷:在工程里使用了 Option Strict 后,就不能进行 后编联了。
表单和新IDE面孔
Visual Basic.NET 的面向对象功能很伟大,但第一次启动 VB.NET 时还注意不到它。可能你注意到的第一件事是它的 IDE。IDE看起来可能很熟悉,建立VS.NET IDE的团队以前的工作是开发VB的IDE,对IDE的增强借鉴了VB IDE的经验。
同时,IDE的改变远比外表显示的深刻。所有.NET语言使用相同的IDE,并且IDE中的新工具功能强大又易于理解。你能把任何一个设计窗口设置为自动隐藏 (就像你能自动隐藏Windows任务栏那样),这样就大大地减少了混乱。主工作区域是一系列选项卡,这意味着IDE不再同时显式多个表单和代码模块。当打开对象的源代码时,IDE在它的主工作区域为工作的对象添加一个新的选项卡。
IDE还包括一个叫作任务表(Task List)的新窗口。它的内容由IDE创建的项目组成。例如,如果在试图编译一个工程时收到一个错误,VB在任务表里创建一个项目来解释这个错误。你能直接向任务表里添加项目,或者通过在代码里以 "TODO:"开始一个注释行,你可以在代码位置和任务之间建立联系。我喜欢Microsoft实现任务表的方式;在程序出炉前,都需要完成些什么?估计它能帮我省掉很多时间和麻烦。看到它时,你最容易产生的一个想法就是:以前怎么就没人想到它呢?
你能注意到的另一个变化就是:VB.NET的表单。Microsoft废弃了旧的表单引擎而使用Windows Form代替它。所有基于 CLR的语言都使用Windows Form引擎。相对于VB6的表单引擎,它有几个重要的改进。例如,Windows Form让你能创建能自动调整组件尺寸的表单,并允许将控件锚定在表单里的特定位置。换句话说,不再需要使用第三方控件就能完成这些特殊任务。Windows Form还允许表演像透明表单这样的很酷的技术。
过去,VB隐藏了建立表单的所有魔术。你使用IDE设计表单并把代码添加到Initialize事件上,但你没有手段来控制这两点之间的过程。现在,表单就是一个类,它包含用来建立表单所有的代码。我把这些代码称为肥料代码,因为大多数开发者希望远远离开它们,越远越好。要想可靠地弄坏你的程序,没有比折腾这些代码更好的办法了。另一方面,技术娴熟的用户可以通过这些代码做很多很酷的事,因为它让你能走到VB.NET表单的幕后。要是你不想看到这些代码你也能不看,因为新代码编辑器有展开和折叠代码区的功能,并且这些肥料代码是默认折叠的。代码编辑器还有几个很酷的新功能。例如,现在它自动为你缩排所有代码(而且还干得不错),它还有内置的显示行号功能。
创建编译的服务器端代码
除了新的Windows Form引擎,.NET还包括一个为创建Web表单而特别设计的表单引擎。这些被称为Web Form的表单很聪明,就像VB让你能很容易地为传统Windows桌面应用程序创建表单一样,它们让你能方便地为Web创建表单。Web Form是 ASP.NET里的技术,让你能使用熟悉的RAD工具创建带有代码的表单。创建的ASP.NET代码编译并驻留在服务器上,并在那里被执行,然后以HTML方式发送给任何一个支持HTML 3.2的浏览器。
底层结构捕获客户端上的事件数据,并把它发送给服务器。这意味着可以使用各种用户界面工具,可以利用现有的表单设计技巧,而且应用程序界面是不依赖浏览器的。如果可以放弃不依赖浏览器,你还有另一个选择来利用Internet Explorer 某些功能特有的优势。Web Form使支持Web的应用程序能更容易地创建更好、更丰富多彩的用户界面。
Web服务策略
VB.NET里的另外一个重要的面向Web的功能是:Web服务。Microsoft的市场部门把Web服务列为采用.NET的几大理由之一。实际上,Web服务的本质就是使用标准协议的、由Web服务器提供的、类似于COM的对象。注意在技术上它们并不是COM对象,但和COM对象的表现方式很相像。Microsoft希望看到所有的公司使用Web服务,并且未来的应用程序可以简单地“粘”在不同的Web服务上,就像现在可以使用Visual Basic for Applications (VBA)建立基于Office和支持VBA的程序的解决方案一样。
在PDC上,对于它希望开发者如何“粘”在这些服务上,Microsoft提供的一个演示程序给出了很好的例子。在这个演示程序里,一个假想的诊所通过Web服务提供预约系统,演示了你可以怎样使用智能电话通过Web进行预约。Visual Basic.NET 甚至会允许你查询服务器,并获得关于服务器能支持的所有Web服务的相关数据。通过IntelliSense dropdown这个绝对有用的工具,程序员可以访问Web服务。Web服务是Microsoft雄心勃勃的战略,但只有时间才能检验它是否能成功地被广泛接纳。
Microsoft试图消除与包装和分发应用程序相关的问题,包括令人恐惧的DLL。所有.NET应用程序被封装为元件。元件包含着数据以描述它运行所需的东西。这些数据被称为货单,包括很多信息,例如:元件身份(名称、版本等等);一个列出了所有文件之间的依赖关系的表,以及它们的位置和版本;包括DLL相关数据的外部依赖关系信息;还有其它元件需要而开发者没有创建的资源。元件是自说明的(通过它们的货单),所以.NET应用程序不需要修改注册表才能工作。换句话说,你不再需要注册表组件。在最好的情况下,即客户机里已经有了.NET运行库时,分发一个复杂的应用程序可能只是把一个文件夹复制到目标机器上这么简单的事。元件的另一个好处是:你可以让不同的应用程序使用同一个DLL的不同版本,并且协调地运行在一台机器上。如果所有这些都可以像计划中那样工作,有关DLL的地狱和版本的噩梦就将成为往事。
正确之路
Microsoft彻底更新了它的技术,而不仅仅是核心语言。例如,在Visual Studio.NET里同时提供了ADO.NET,这是有特殊优点的下一代ActiveX Data Objects (ADO) 版本。它的一个灵活改变是:ADO.NET用Extensible Markup Language (XML)作为在组件之间传递数据集的格式。这意味着接收组件不一定必须是ADO.NET组件,同时接收组件可以接受任何XML 格式的数据集。谈到XML,它支撑着VS.NET中的任何东西,从配置文件到远端过程调用。ADO.NET在处理断开的数据集时比 ADO的性能要好,并且具有更好的伸缩性。
Visual Basic.NET对我们都很熟悉的VB做了重要的改变。C++革命性地跳跃到.NET后有了一个新名字:C#,而Visual Basic的名字没变。然而,如果你把VB.NET当作语法相似的一门新语言而不是简单的“升级”,可能掌握起来就要容易一些。本文给你一个起点,但吸收掌握各种知识,并对未来做出有根据的决定是一个艰苦的过程,它只是这个过程的一条起跑线。我不知道.NET会有多么成功,它的很多地方吸引我,但有些地方并非如此。这个工具做了大量承诺,它夸耀很多功能能使 VB开发者更简单地创建更有伸缩性的高端应用程序。最后,它的成功将取决于开发者能多好地将它应用于现实世界。
概要
VB正在不断地发展中,它具备了以前VB编程人员作梦都想拥有的性能,想象一下你将随心所欲的利用这些性能,是不是很令人激动?然而,这个计划于2001年第
关 键 词: vb.net .NET
微软公司提出的.NET概念,正从各个方面渗入到我们的生活中。它将产生的作用,诚如一位业内名家所描述的:“请忘掉你认为你所知道的,.NET将改变一切”!既然如此,无论是IT业内人士、还是企业决策者,快速领会这个新概念的含义及深远影响,都显得非常必要。
概要
VB正在不断地发展中,它具备了以前VB编程人员作梦都想拥有的性能,想象一下你将随心所欲的利用这些性能,是不是很令人激动?然而,这个计划于2001年第四季度上市销售的VB版本可能会给你带来些小麻烦,因为要完全掌握它需要一个较长的学习周期,而且其中包括了一些微妙的变化,你可能在使用他们的时候出现错误。
需要准备的条件:建议获得Visual Basic.NET beta 版,这些内容对所有VB程序员都是有用的。
Microsoft .NET平台的涵盖面很广,而且很难预测它的真正意义。我们注意到,现在有很多关于.NET的不正确的理解。因此在这篇文章里,我们将把给你一个VB.NET到底是些什么的概念,从头到尾说一说它是什么、它能干什么以及怎样才能充分发挥它的优点。我们要特别地细看一下IDE的改变、面向对象特征、底层结构的改变、一些“现代化”的语法以及包装和分发方面的增强。我们将讨论这些功能能为你做什么,解释他们的优点与不足。由于这些改变是如此之大,而且涉及方方面面,因此希望这一篇文章能满足你全部的要求是不现实的,要了解这方面全部的知识请参阅有关文章和书籍。
Visual Basic.NET 和你现在所知的开发工具完全不同,并且这个新版本会改变你的未来。到底有多大不同?如果你觉得从VB3迁移到VB4是一个很大的变化,那这次VB.NET会让你感到震惊。这次升级与其说是VB的一个新版本,还不如说是迁移到一个新平台上,你所面临的情况就和从DOS迁移到Windows差不多。
VB获得了继承能力
VB.NET预期拥有的第一新功能就是继承能力。继承是VB开发者长期以来要求得最多的功能。判断一下对继承的要求是不是像早些时候对本地化编译器的要求一样将是一件很有意思的事,后者,当Microsoft提供了一个以后,你就几乎听不到多少这方面的言语了。
Visual Basic现在是真正的面向对象语言了。过去,你可以通过使用VB的界面继承性创建伪实现的对象继承,但现在不必这样做了。
Visual Basic.NET 现在提供大量面向对象功能,包括应用程序继承,它允许你从其它类导出你想创建的类。像在其它面向对象语言里一样,你能覆盖基类的方法和属性,并且能实现多态以创建健壮的、扩展性好的组件。例如,假定你从基类 Crane里继承产生了一个ForkLift类,你能使用像下面的代码覆盖基类里对Lift方法的默认实现:
Public Class ForkLift
Inherits Crane
Overrides Sub Lift(ByRef _
Height As Double)
Height = Height + 10
End Sub
End Class
VB.NET不仅能让你覆盖方法或属性;它还能让你重载方法。重载是定义同名、但使用不同数据类型的方法或属性的能力。例如,假定你有一个组件能对不同数据类型的数组进行排序,你不需要三个(每种数据类型一个)不同名的方法;实际上你可以重载一个方法名:
Overloads Sub SortArray(ByRef _
aValues()As String)
...
Overloads Sub SortArray(ByRef _
aValues() As Integer)
...
Overloads Sub SortArray(ByRef _
aValues() As Object)
一个改变是:表单现在是类模块。这就是说类本身包含建立表单的所有“肥料”的代码。你可能想知道,为什么你不得不看到这些从前不用看的代码,但这个改变同时带来强大的新功能,包括继承这些表单的能力。Microsoft把这一技术称为可视化继承。假定你的对话框有一种标准的格式,例如在表单的一侧有一行按钮,并在角上有一个标识,那么,通过可视化继承你能创建一个表单模板(类),并从这个基类里导出所需的表单。
一切都是对象
代码复用简化了开发过程,像实现和可视化继承这样的功能有利于更简单、更强大的代码复用。然而,代码复用并不是到此为止。你能通过支持VB.NET的通用语言运行库(Common Language Runtime - CLR)继承在其它 VS.NET 语言里定义的类。例如,你或别人创建了一个 C# 类,然后就能从 VB 里继承它。
VB.NET 的面向对象能力扩展了语言本身的通路:一切都是对象。这意味着比在以前的 VB 版本里,你获得了更多的内在功能,你将很少被迫使用 Windows API。例如,在以前的 VB 版本里,你使用 LoadPicture 方法加载图片并使用表单的 Line 方法(或较快的 API) 画线。现在,你使用 System.Drawing 对象来创建并处理图形。你可以使用以下代码在表单上显示一幅图片:
picshowpicture.Image = _
system.Drawing.Image.FromFile( _
"c:\test.bmp")
注意 VB.NET 的“一切都是对象”方式让你的语句能用得更长久。
考虑以下语句,它在一个图形对象上画一条黄绿色的线:
objgraphics.DrawLine(system.Drawing. _
Pens.Chartreuse, 0, 0, 100, 100)
这些长长的语句也有好处:改进的功能、适应性和易用性。从前,你要实现先进的功能就不得不在文档中挖掘,经常是不得不诉诸API。现在,相关的功能集符合逻辑地包含在对象里。这种处理方式的另外一个好处就是:类把相关的功能很好的组织了起来。所以,浏览你感兴趣的对象,发现它们做些什么实际上很有意思。
Visual Basic.NET 的面向对象功能提供了很多实在的好处。很多情况下,VB.NET 面向对象的本质和实现的继承性能帮助你比在以前的 VB 版本里更容易、更迅速地创建特定类型的功能。然而,你不一定要仅仅因为你能做到,就使用实现继承性或其它 .NET 功能。VB.NET 的新功能使开发许多类型的应用程序变得更简单!但是,就像使用所有的语言能力一样,你需要使用的是在特定场合下最适合的功能。
自由线程的危险
对于自由线程可能需要特别给出警告。VB6允许你使用独立的线程来创建多线程服务器程序,但VB过去从来没有让你能创建自由线程的客户端程序。VB.NET 改变了这一切。现在,创建自由线程应用程序几乎成了最微不足道的事情。实际上,我估计那些没有理解其中的微妙差别,就在他们的应用程序里添加了自由线程的程序员会遇到很多问题。只需要几行代码就能启动一个新线程:简单地将线索对象的地址传递给方法,方法本身就会启动线程。这确实是很酷也很有用的东西,但你需要小心:这些功能适用于特定的场合,确定哪些是适用的场合并且明智的使用这些工具则是你自己的事。许多开发者使用继承性和自由线程时给自己找了不少麻烦,请不要让这些发生在你身上。
可能大家讨论得最多的 VB.NET 特征就是 CLR (通用语言运行库),VB 运行在它的顶层上。是 CLR 提供了 VB.NET 的许多关键功能。例如,CLR 使实现和跨语言继承性以及自由线程成为可能。
分发VB程序要求你同时分发VB的运行库,在VB6里即是msVBvm60.dll。许多其它语言也有类似的要求,包括 C++ 和 Java。在Visual Studio.NET里,所有的Visual Studio语言共享同一个运行库:CLR。这里有几个较大的变化,首先,所有的Visual Studio语言现在都共享同一个IDE、同样的表单引擎、同样的异常处理机制等等。这意味着Visual Basic和像 C#这样的语言拥有同等的地位,至少差不多是同等的。
易于反编译的中间语言
无论你用VB、C#或其它.NET语言编写应用程序,VS.NET代码都编译成为中间语言(IL)。当应用程序运行时,一个即时编译器(JITter)处理IL代码并把它编译成为机器语言。这意味着在理论上可能为Windows以外的平台创建.NET运行库,但现在关于类似的事情还没有任何官方消息。中间语言的一个缺陷是:它像VB5以前的VB版本一样,容易被反编译。这种可能性使许多开发者普遍地质疑.NET架构的安全性。
CLR在IL层次内外影响代码,对它的修改将使所有使用CLR的语言受益。然而,语言只是和代码如何被解释为IL有关,对特定语言的优化可以根据特定语言的语法来编写,这样在技术上就可能使.NET语言之间的性能差别很小。不管怎样,大体上蓝图是美好的。例如,CLR使VB的调试和监测工具和C#的相应工具相当,它做到了这一点因为它们本来就是相同的工具。
CLR提供不平行的跨语言集成,包括跨语言继承代码的能力。所有使用CLR的语言共享一个通用类型系统,它使使用多种语言开发应用程序变得更简单。我不喜欢把 C API 声明翻译成VB里可以使用的形式,所以我很赞赏通用类型系统带来的好处。
在CLR中运行的代码被称为被管理代码,被管理代码使用的内存完全由CLR来控制。被管理代码带来很多好处,包括跨语言集成、跨语言异常处理和简化的部件相互作用模型。Visual Basic被限制为只能以被管理代码的方式工作,然而C#拥有跳到非被管理代码的能力(执行到运行库之外),并能做像指针操作这类事情。这是VB和C#不同等的情况之一。这种能力到底有多重要取决于你想干什么。
CLR造成的体系结构差别要比跨语言集成、共享功能和被管理代码等深刻。首先,Visual Studio.NET的支撑结构不是 COM。另外,VB.NET里的所有东西,甚至字符串都是对象。因为这些和其它一些原因,Microsoft改变了支撑结构处理对象的方式。COM实现了一个引用计数方案,这样每次引用一个对象时,计数器递增。当一个对象引用超出作用域或被释放时,计数器递减,当引用计数减少到零时就终止这个对象。Microsoft声称在.NET架构下引用计数的开销太大,以至于不能在 .NET中实现它,所以它放弃了引用计数转而使用垃圾收集。
垃圾收集需要新体系结构
CLR垃圾收集器主要是监视一个程序的资源,当可用资源达到确定的阈值时寻找无用的对象,并在发现它们的时候清除这些对象。垃圾收集的一大好处就是你不再需要担心大多数普通的循环引用,即子对象引用了父对象,然后父对象又引用了子对象。在引用计数方案下,循环引用使两个对象都不能被释放和清除。然而,垃圾收集器会发现循环引用并清除它们。这也意味着释放对象的最后一个引用时不再需要立即清除对象。
垃圾收集的一个后果是:你再也不能指望一个类的 Terminate 事件能在适当的时机发出。实际上,如果线程被阻塞,可能根本就不会发出 Terminate 事件。和COM提供的确定化终止相反,它被称为不确定的终止。缺乏确定化终止,以及因为垃圾收集器重新安排并压缩内存从而不能使用指针的事实,在新闻组里激发了一波激烈的辩论。我想这些新限制可能会令你痛恨,因为你要依靠确定化终止;也可能你漠不关心,因为你不依赖 Terminate 事件。垃圾收集并不是万灵药,实现弱引用依然需要做一些考虑。
从引用计数到垃圾收集只是 Visual Studio.NET 的支撑结构不是 COM 这个事实的表象之一。你能在VB.NET中使用COM对象,比如说ActiveX服务器或ActiveX控件。然而,你必须通过包装访问这些对象。任何时候听到“包装”这个术语,你应该明白你面对着性能损失,并且对象的行为可能有所不同。如果当计划移植一个使用了大量COM对象的工程,就需要认真地测试和计划,可能需要重新规划应用程序的结构才能移植成功。坦率地说,你要有遭受挫折的准备。还记得从VBX迁移到 OCX的过程吗?我记得,我的精神病医生也记得。我很快就要再去看他了 ;-)
语言本身的变化要远远超过体系结构的变化。大部分改变确有道理,但我并不认为所有的改变都是如此。以前版本的VB允许你以很多方法来做很多事,以至于统一的编码标准要么不存在要么就很难强加于人。Microsoft对VB做了大量的改变为的就是“清晰”这种语言。很多情况下,原来你有好几种方法做一件事,现在就只有一种了。Billy Hollis 提供了语法变化的详细列表,包括废弃的关键字列表,但有些东西需要在这里重复一下。
首先,向过程参数传递数据的默认方法由引用(ByRef)变成了传值(ByVal)。这个改变主要是因为引用要比传值的风险大得多。它的风险主要是调用过程中的数据可能被无意中篡改。你仍然能通过引用传递数据,但这一改变使你需要修改新的默认调用方法来使用引用。
Set语句消失了
其次,Set 语句消失了。在 VB.NET 里如果你需要向变量传递一个对象引用,所需要的只是一个等号,对象被视为同其它值一样。这很酷,但也有副作用:默认属性消失了。例如,你不再能用这种方式引用一个属性:
Text1 = "What, me worry?"
作为替代,你必须显式地引用属性:
Text1.Text = "What, me worry?"
也许一眼看来不需要这种改变,但确实必须去掉默认属性。例如,假定你有一个叫objFoo的对象变量,不用Set语句,下面的语句所设置的引用就产生了歧义性:
objFoo = Text1
这条语句是应该设置到Text1的引用,还是以Text1的Text属性来填充objFoo?你不能确定,编译器也不能。抛弃Set语句同时要求抛弃默认属性。
有一个改变我不喜欢:你不再能在不同的作用域里声明Property Get和Property Set过程。注意 VB.NET 没有 Property Let 语句:对象和数值都用 Property Set。这意味着你不能用一个 Friend Property Let 过程来对应一个 Public Property Get。用VB建立组件时可能会有麻烦。许多组件开发者创建 Friend Property Set 过程以使他们的应用程序能改变一个值,但提供 Public Property Get 过程以使他们的客户程序能取回值。我希望我能为这个改变找到一个合适的理由,可是我找不到。
Microsoft说它力图使语言保持清晰并使之现代化—大部分情况下它做得不错—但这个作用域问题和其它几个问题令人感到困惑。例如,While...Wend 很早以前就应该消失了,因为 Do...Loop 完成同样的功能。然而,Microsoft 不仅没能去掉 While...Wend,还把它改成了 While...End While 来给自己找了更多的麻烦。真奇怪!
我最不喜欢的改变是:Microsoft改变了你已经使用的数据类型含义。在 .NET 里,Integer 现在是 32 位,而 Long 变成了 64 位。我心存恐惧地想:开发者 (包括我自己) 会多么频繁地使用错误的变量啊。那个API到底是接受一个16位的 Integer还是32位的?老天!我希望Microsoft重新考虑这个决定并使用新的变量类型,比如Int32和Long64。无论迁移到 VB.NET的移植工具是多么的好,它也不能改变开发者的记忆。为什么要逼着我们再学一遍普通的数据类型呢?
最后,最需要的一个改变是:VB.NET引入了 Option Strict 关键字,你可以使用它来代替 Option Explicit。Option Strict 结束了万恶的类型强制(tm),通过它VB乐于让你把一个数值赋值给一个字符串,然后像犯罪一样做另一个操作。设置 Option Strict 告诉 Visual Basic.NET 不要为你做任何类型强制。注意 VB.NET 并不是彻底的控制狂,它允许类型向下转换,但不允许向上。例如,不使用像 sngvariable = CSng(dblvariable) 这样的语句进行显式类型转换,你就不能把声明为 Single 的变量赋值给声明为 Double 的变量。因为这有丢失数据的风险。然而,你能不使用显式类型转换就把声明为 Double 的变量赋值给声明为 Single 的变量,因为这并没有丢失数据的危险。使用 Option Strict 能帮助开发者减少很多类型错误,包括那些很难调错的。但有一个附加的缺陷:在工程里使用了 Option Strict 后,就不能进行 后编联了。
表单和新IDE面孔
Visual Basic.NET 的面向对象功能很伟大,但第一次启动 VB.NET 时还注意不到它。可能你注意到的第一件事是它的 IDE。IDE看起来可能很熟悉,建立VS.NET IDE的团队以前的工作是开发VB的IDE,对IDE的增强借鉴了VB IDE的经验。
同时,IDE的改变远比外表显示的深刻。所有.NET语言使用相同的IDE,并且IDE中的新工具功能强大又易于理解。你能把任何一个设计窗口设置为自动隐藏 (就像你能自动隐藏Windows任务栏那样),这样就大大地减少了混乱。主工作区域是一系列选项卡,这意味着IDE不再同时显式多个表单和代码模块。当打开对象的源代码时,IDE在它的主工作区域为工作的对象添加一个新的选项卡。
IDE还包括一个叫作任务表(Task List)的新窗口。它的内容由IDE创建的项目组成。例如,如果在试图编译一个工程时收到一个错误,VB在任务表里创建一个项目来解释这个错误。你能直接向任务表里添加项目,或者通过在代码里以 "TODO:"开始一个注释行,你可以在代码位置和任务之间建立联系。我喜欢Microsoft实现任务表的方式;在程序出炉前,都需要完成些什么?估计它能帮我省掉很多时间和麻烦。看到它时,你最容易产生的一个想法就是:以前怎么就没人想到它呢?
你能注意到的另一个变化就是:VB.NET的表单。Microsoft废弃了旧的表单引擎而使用Windows Form代替它。所有基于 CLR的语言都使用Windows Form引擎。相对于VB6的表单引擎,它有几个重要的改进。例如,Windows Form让你能创建能自动调整组件尺寸的表单,并允许将控件锚定在表单里的特定位置。换句话说,不再需要使用第三方控件就能完成这些特殊任务。Windows Form还允许表演像透明表单这样的很酷的技术。
过去,VB隐藏了建立表单的所有魔术。你使用IDE设计表单并把代码添加到Initialize事件上,但你没有手段来控制这两点之间的过程。现在,表单就是一个类,它包含用来建立表单所有的代码。我把这些代码称为肥料代码,因为大多数开发者希望远远离开它们,越远越好。要想可靠地弄坏你的程序,没有比折腾这些代码更好的办法了。另一方面,技术娴熟的用户可以通过这些代码做很多很酷的事,因为它让你能走到VB.NET表单的幕后。要是你不想看到这些代码你也能不看,因为新代码编辑器有展开和折叠代码区的功能,并且这些肥料代码是默认折叠的。代码编辑器还有几个很酷的新功能。例如,现在它自动为你缩排所有代码(而且还干得不错),它还有内置的显示行号功能。
创建编译的服务器端代码
除了新的Windows Form引擎,.NET还包括一个为创建Web表单而特别设计的表单引擎。这些被称为Web Form的表单很聪明,就像VB让你能很容易地为传统Windows桌面应用程序创建表单一样,它们让你能方便地为Web创建表单。Web Form是 ASP.NET里的技术,让你能使用熟悉的RAD工具创建带有代码的表单。创建的ASP.NET代码编译并驻留在服务器上,并在那里被执行,然后以HTML方式发送给任何一个支持HTML 3.2的浏览器。
底层结构捕获客户端上的事件数据,并把它发送给服务器。这意味着可以使用各种用户界面工具,可以利用现有的表单设计技巧,而且应用程序界面是不依赖浏览器的。如果可以放弃不依赖浏览器,你还有另一个选择来利用Internet Explorer 某些功能特有的优势。Web Form使支持Web的应用程序能更容易地创建更好、更丰富多彩的用户界面。
Web服务策略
VB.NET里的另外一个重要的面向Web的功能是:Web服务。Microsoft的市场部门把Web服务列为采用.NET的几大理由之一。实际上,Web服务的本质就是使用标准协议的、由Web服务器提供的、类似于COM的对象。注意在技术上它们并不是COM对象,但和COM对象的表现方式很相像。Microsoft希望看到所有的公司使用Web服务,并且未来的应用程序可以简单地“粘”在不同的Web服务上,就像现在可以使用Visual Basic for Applications (VBA)建立基于Office和支持VBA的程序的解决方案一样。
在PDC上,对于它希望开发者如何“粘”在这些服务上,Microsoft提供的一个演示程序给出了很好的例子。在这个演示程序里,一个假想的诊所通过Web服务提供预约系统,演示了你可以怎样使用智能电话通过Web进行预约。Visual Basic.NET 甚至会允许你查询服务器,并获得关于服务器能支持的所有Web服务的相关数据。通过IntelliSense dropdown这个绝对有用的工具,程序员可以访问Web服务。Web服务是Microsoft雄心勃勃的战略,但只有时间才能检验它是否能成功地被广泛接纳。
Microsoft试图消除与包装和分发应用程序相关的问题,包括令人恐惧的DLL。所有.NET应用程序被封装为元件。元件包含着数据以描述它运行所需的东西。这些数据被称为货单,包括很多信息,例如:元件身份(名称、版本等等);一个列出了所有文件之间的依赖关系的表,以及它们的位置和版本;包括DLL相关数据的外部依赖关系信息;还有其它元件需要而开发者没有创建的资源。元件是自说明的(通过它们的货单),所以.NET应用程序不需要修改注册表才能工作。换句话说,你不再需要注册表组件。在最好的情况下,即客户机里已经有了.NET运行库时,分发一个复杂的应用程序可能只是把一个文件夹复制到目标机器上这么简单的事。元件的另一个好处是:你可以让不同的应用程序使用同一个DLL的不同版本,并且协调地运行在一台机器上。如果所有这些都可以像计划中那样工作,有关DLL的地狱和版本的噩梦就将成为往事。
正确之路
Microsoft彻底更新了它的技术,而不仅仅是核心语言。例如,在Visual Studio.NET里同时提供了ADO.NET,这是有特殊优点的下一代ActiveX Data Objects (ADO) 版本。它的一个灵活改变是:ADO.NET用Extensible Markup Language (XML)作为在组件之间传递数据集的格式。这意味着接收组件不一定必须是ADO.NET组件,同时接收组件可以接受任何XML 格式的数据集。谈到XML,它支撑着VS.NET中的任何东西,从配置文件到远端过程调用。ADO.NET在处理断开的数据集时比 ADO的性能要好,并且具有更好的伸缩性。
Visual Basic.NET对我们都很熟悉的VB做了重要的改变。C++革命性地跳跃到.NET后有了一个新名字:C#,而Visual Basic的名字没变。然而,如果你把VB.NET当作语法相似的一门新语言而不是简单的“升级”,可能掌握起来就要容易一些。本文给你一个起点,但吸收掌握各种知识,并对未来做出有根据的决定是一个艰苦的过程,它只是这个过程的一条起跑线。我不知道.NET会有多么成功,它的很多地方吸引我,但有些地方并非如此。这个工具做了大量承诺,它夸耀很多功能能使 VB开发者更简单地创建更有伸缩性的高端应用程序。最后,它的成功将取决于开发者能多好地将它应用于现实世界。
vb.net基础知识
做软件,必须要懂的一门语言,vb就是一种简单易学的语言,受到编程爱好者的追捧,我就是一个超级fans,之所以喜欢他这种语言,使用为他的可视化做的非常完美,如今vb7.0已经和c#整合到同一个ide环境中,使得vb更加强大,可以写出很多功能完美的网络软件,如今微软的开发工具升级的非常的快,无论工具如何升级,万变不离其踪,先把最基础的学好,学牢固,日后才可以成为高手。那就从下一节开始吧。
订阅:
评论 (Atom)