vb.net且或非 vbs 与或非

vb和vb.net的区别和特点

1、vb.net  完全符合面向对象的编程语言抽象、封装、继承的四大特性,而vb不支持继承。

公司主营业务:成都网站设计、网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出抚州免费做网站回馈大家。

2、错误处理不同。

vb中只是On Error.....goto和On Errer Resume Next ,这些错误称为非结构化异常处理。而在vb.net中采用的结构化异常处理机制,try...catch....finally控制。

3、两者产生的窗体不同。

vb.net 允许创建不同类型的应用程序,例如,创建ASP.NET和ASP.NET Web 服务应用程序,还允许创建控制台应用程序和作为桌面服务运行的应用程序。但是vb 只能创建Windows窗体。

4、数据库访问的差别。

vb6.0是通过ADO(Active X Data Objext)来实现对数据库访问。而vb.net 是通过ADO.NET来访问数据库。

扩展资料

Visual Basic(简称VB)是Microsoft公司开发的一种通用的基于对象的程序设计语言,为结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。是一种可用于微软自家产品开发的语言。

“Visual” 指的是开发图形用户界面 (GUI) 的方法——不需编写大量代码去描述界面元素的外观和位置,而只要把预先建立的对象add到屏幕上的一点即可。

“Basic”指的是 BASIC (Beginners All-Purpose Symbolic Instruction Code) 语言,是一种在计算技术发展历史上应用得最为广泛的语言。

Visual Basic源自于BASIC编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易的使用DAO、RDO、ADO连接数据库,或者轻松的创建Active X控件,用于高效生成类型安全和面向对象的应用程序 。

参考资料:百度百科-Visual Basic

vb和vb.net的区别

VB.NET和VB6.0有什么区别

Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。本文将介绍VB.NET的新特性,并比较VB6.0/VB.NET之间的区别,阐述如何利用VB.NET编写简单的应用程序。

1.1 什么是 VB.NET? Microsoft推出全新的编程和操作系统Framework——.NET,支持多种语言利用公共.NET库开发应用程序,这些应用程序在.NET Framework上运行。使用Visual Basic在.NET Framework上编程,这就是VB.NET。

首先,让我演示在VB.NET中写最简单的控制台程序:Hello World。

1.2 Hello, World!“Hello World!”是初学者学习Windows编程的代表性程序。我们的第一个程序就叫做“Hello VB.NET World!”。该程序在控制台输出一句话:“Hello VB.NET World!”,代码如下所示:

代码 1.1: Hello VB.NET World例子Imports System

Module Module1

Sub Main()

System.Console.WriteLine("Hello VB.NET World!")

End Sub

End Module

1.3 VB.NET 编辑器和编译器你可以在记事本或VS.NET IDE等任意文本编辑器中撰写上述代码,然后保存为HelloWorld.vb。 代码编写完成之后,要么在命令行、要么在VS.NET IDE中编译它。在Microsoft .NET Framework SDK中已经包括VB.NET编译器vbc.exe[][1],从IDE或是命令行都可以调用。要从命令行编译HelloWorld.vb,请在命令行窗口输入

vbc HelloWorld.vb /out:HelloWorld.exe /t:exe

编译结束后,HelloWorld.exe被创建到当前目录下。在资源管理其中双击图标或在命令行执行,程序正确地运行了。祝贺你进入VB.NET开发者的行列。

Imports 语句

如你所知,大部分的.NET类型都在名字空间(namespace)中定义。Namespace是定义和管理类别的范畴。察看.NET Framework Class Library,可以看到数以百计的namespace。例如,System namespace就包括了Console、Object等类型定义。如果想使用Console类,需要用Imports指令导入System namespace。如下所示:

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

代码1.2: Hello VB.NET World例子Module Module1

Sub Main()

System.Console.WriteLine("Hello VB.NET World!")

End SubEnd Module1.4 解析 "Hello VB.NET World!"程序第一行是:

Imports System; System namespace定义了Console类,该类用于读写控制台(命令行窗口)。然后你定义了一个module:Module Module1

…End Module所有的VB程序都包括一个Main()方法,即应用程序入口点。在例子程序中,我们调用Console.WriteLine()向控制台写入“Hello VB.NET World!”:

Sub Main()

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

Console类负责读写系统控制台。读控制台输入用Read和ReadLine方法,向控制台输出用WriteLine方法。

表1.1 Console类定义的方法

方法 用途 例子

Read 读入单个字符 int i = Console.Read();

ReadLine 读入一行 string str = Console.ReadLine();

Write 写一行 Console.Write("Write: 1");

WriteLine 写一行,并带上行结束符

Console.WriteLine("Test Output Data with Line");

1.5 VB.NET有什么新特点? VB.NET比 VB6.0更加稳定,而且完全面向对象。也许你还记得,VB6.0不支持继承、重载和接口,所以不是真正面向对象的。而VB.NET则支持这些面向对象特性。VB6.0有两个薄弱环节——多线程和异常处理。在VB.NET中,开发多线程应用和使用C++/C#别无二致,结构化异常处理也得到支持。稍后我们会详细解释这些特性。

下面是VB.NET的特性列表——

·面向对象的编程语言。支持继承、重载、接口、共享成员和构造器。·支持所有的CLS特性,如存取控制.NET类、与其它.NET语言交互、元数据、公共数据类型、委托等等。·多线程支持。·结构化异常处理。 1.6 名字空间与集合 前面讨论了我们的第一个VB.NET程序。该程序中首先引人注意的是名字空间(namespace)。在.NET参考文档中,你会发现每个类都归属于某个namespace。那么,namespace到底是什么?

一个namespace是类和组件的逻辑组合,其目的在于将.NET class按类别定义。微软借用了C++ class packaging概念:namespace来描述这种组合。.NET Framework中的组件被称为集合(assembly)。全部.NET代码在数百个库文件(DLL)中定义。Namespace把assembly中定义的类组织起来。一个namespace可以包括多个assembly,一个assembly也可以在多个namespace中定义。 namespace树的根节点是System namespace。在.NET Library中,每个class都在一组相似的类别中定义。例如,System.Data namespace只包括数据相关类。同样,System.Multithreading只包括多线程类。

在使用.NET支持的语言(如C#、VB.NET、C++.NET等)创建新应用程序时,你会注意到每个应用程序都被定义为一个namespace,而所有的class都归属于这个namespace。通过引用这个namespace,其它应用程序就能存取这些class。 在.NET中,代码被编译为中间语言(Intermediate Language,IL),assembly中存储了IL代码、元数据和其它资源文件。同一个assembly可以附属于一个或多个Exe/DLL。所有的.NET库都存储在assembly中。

1.7 VB.NET: 完全面向对象的编程语言抽象、封装、多态、继承是面向对象语言的四个基本属性。VB6.0不支持继承,而VB.NET则不然。所以,和C++一样,VB.NET也是完全面向对象的编程语言。

Class 和 ModuleVB.NET用Class...End Class语句对创建class。每个VB.NET至少包括一个Module(模块)。Module在Module…End Module语句对中实现。应用程序的主要模块是Main方法,亦即应用程序入口点。

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

Module Module1

Sub Main()

Dim cls As TestClass = New TestClass

Console.WriteLine(cls.MyMethod)

End Sub

Class TestClass

Function MyMethod() As String

Return "Test Method"

End Function

End Class

End ModuleProperty属性(Property)是类变量的公共描述。Property…End Property语句用以创建property。属性的Get/Set方法分别用于取得和设置属性值。下面的例子中,Data是TestClass的属性。

Imports System

Imports System.Console

Module Module1

Sub Main()

Dim cls As TestClass = New TestClass

WriteLine(cls.MyMethod)

WriteLine(cls.Data)

cls.Data = "New Data"

WriteLine(cls.Data)

End Sub

End Module

Class TestClass

Private strData As String = "Some Data"

Function MyMethod() As String

Return "Test Method!"

End Function

' Adding Data property to the class

Public Property Data() As String

Get

Return strData

End Get

Set(ByVal Value As String)

strData = Value

End Set

End Property

重载VB.NET通过overload关键字支持方法重载。使用这个关键字,你可以定义同名但不同参数的方法。

类成员访问域

除了原有的Private和Public,VB.NET引入了几个新关键字。全部访问域关键字列表如下:

关键字 作用域

Private 限于class内部

Public 可以从class外访问

Friend 限于class所属的应用程序内

Protected 只能被class和其派生类访问

Protected Friend 能被class、应用程序和派生类访问

继承继承是面向对象编程语言中最常用的技术。继承让你能够重用类代码和功能。

VB.NET支持继承,而VB6.0则不支持。继承的好处在于你能使用任何人编写的类,从这些类派生自己的类,然后在自己的类中调用父类功能。在下面的例子中,Class B派生自Class A,我们将从Class B中调用Class A的方法MethodA。

Imports System

Imports System.Console

Module Module1

Sub Main()

Dim bObj As B = New B

WriteLine(bObj.MethodA())

End Sub

End Module

' Class A defined

Public Class A

Function MethodA() As String

Return "Method A is called."

End Function

End Class

'Class B, inherited from Class A. All members (Public and Protected)

' can be access via B now.

Public Class B

Inherits A

Function MethodB() As String

Return "Method B is called."

End Function

End Class

可以从一个class中派生多个自定义class,也可以从多个class派生一个自定义class。

共享的成员类的共享成员被类的所有实体共享。共享成员可能是属性、方法或字段/值域。在你不想让用户全面控制自己的类时,共享成员相当有用。例如,你可以开发一个类库,让用户通过共享成员使用其中的部分功能。

可以通过class本身引用共享成员,而无需通过类的实体。例如:Module Module1

Sub Main()

WriteLine(A.MethodA())

End Sub

End Module

' Class A defined

Public Class A

Shared Function MethodA() As String

Return "Method A is called."

End Function

End Class

多线程VB语言的一大弱点就是缺乏编写自由线程(free-threaded)程序的能力。在.NET Framework中,所有语言共享CRL(Common Runtime Library,公共运行库),也就是说,你可以用VB.NET、C#或其它.NET语言编写同样的程序。

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

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

创建线程使用Thread类的实体创建一个新线程,然后用Thread.Start方法开始执行线程。线程构造器接受一个参数,该参数指明你要在线程中执行的procedure。在下例中,我想在oThread1(Thread类的一个实体)的第二线程中执行SecondThread过程:

oThread1 = New Thread(AddressOf SecondThread)

SecondThread procedure looks like below:

Public Sub SecondThread()

Dim i As Integer

For i = 1 To 10

Console.WriteLine(i.ToString())

Next

End Sub

然后,调用Thread.Start()开始线程:

oThread1.Start()

下面的代码创建两个第二线程:

Imports System

Imports System.Threading

Module Module1

Public oThread1 As Thread

Public oThread2 As Thread

Sub Main()

oThread1 = New Thread(AddressOf SecondThread)

oThread2 = New Thread(AddressOf ThirdThread)

oThread1.Start()

oThread2.Start()

End Sub

Public Sub SecondThread()

Dim i As Integer

For i = 1 To 10

Console.WriteLine(i.ToString())

Next

End Sub

Public Sub ThirdThread()

Dim i As Integer

For i = 1 To 10

Console.WriteLine("A" + i.ToString())

Next

End Sub

End Module

破坏线程 调用Abort方法来破坏(中止)一个线程。在调用Abort之前,确保用IsAlive判断线程处于活动状态。

If oThread1.IsAlive Then

oThread1.Abort()

End If

暂停线程可以使用Sleep方法来暂停线程执行。Sleep方法接受一个以毫秒为单位的参数,指明线程应当暂停多长时间。

下面的例子让线程暂停1秒钟:

oThread2.Sleep(1000)你也可以使用Suspend和Resume方法来挂起和继续线程执行。

设定线程优先级Thread类的Priority属性用于设定线程优先级。该属性可以设置为Normal,AboveNormal,BelowNormal,Highest和Lowest。如:

oThread2.Priority = ThreadPriority.Highest线程与Apartment使用ApartmentState属性设置线程的apartment类型,该属性值可以为STA,MTA或是Unknown[][2]:

oThread.ApartmentState = ApartmentState.MTAMTS意味着可以使用多线程模式,而STA则只能是单线程执行。

Public Enum ApartmentState

{

STA = 0,

MTA = 1,

Unknown = 2,

}

1.8 结构化异常处理异常处理也被称之为错误处理。作为VB程序员,你一定对On Error Goto和On Error Resume Next这些VB6.0错误处理语句耳熟能详。这种类型的错误处理被称为非结构化异常处理(Unstructured Exception Handling)。而在VB.NET中,Microsoft推出了结构化异常处理机制。VB.NET支持类似C++的TryCatch..Finally控制。Try..Catch..Finally结构如下: Try

' 可能导致异常的代码

Catch

' 当异常发生时处理异常的代码

Finally

' 清理现场

End Try

Try语句块用以抛出异常。如果异常发生,在Catch语句块中处理。Finally语句块是可选的,在需要释放资源时特别有用。

1.9 VB6.0与VB.NET的不同之处除了上面谈到的语言进化,还有一些语法上的变化。所有这些语言和语法的变化在MSDN中均可查到,本文只作简单介绍。

数据类型(Data Type)的改变VB.NET中有些数据类型得到改进。下面是变化对照表。

数据类型 VB6.0 VB.NET

Integer 16 bit size 32 bit size

Long 32 bit size 64 bit size

Currency 用于存储大浮点数 被decimal替代,支持更高精度

Variant 可以存储任意类型数据 被Object类型替代,也可以存储任意类型数据,但结果更好

Date Date类型被存储为double 引入DateTime类型,用于存储不同格式的日期

在VB.NET中,Short数据类型是16 bit的。Short,Integer和Long都等同于CLR的System.Int16、System.Int32和System.Int64类型。 变量声明的变化在VB6.0中,变量声明有许多限制。其中之一就是不能同行声明多个变量。如果一定要在一行中声明多个变量,就一定得指明每个变量的类型,否则将被默认为Variant类型。

Dim a1, a2 As Integer Dim a3 As Integer, a4 As Integer 第一行中的a1是Variant类型,a2是Integer类型。第二行中两个变量都是Integer类型。VB.NET支持同行声明多个变量,举例如下:

Dim a1, a2, a3 As Integer 变量初始化是另一个问题。在VB6.0中不能同时声明和初始化变量,而VB.NET则支持这个特性。

Dim name As String = "Mahesh"System.Console.Write(name) 声明常量也可以照此办理:Const DT_COUNT As Integer = 23 New关键字。在VB.NET中,New关键字用于创建对象。由于数据类型是对象,所以New关键字用以创建一个数据类型对象。

Dim i As Integer = New Integer()i = 10System.Console.WriteLine(i.ToString()) 代码块级别支持。像C++一样,VB.NET支持代码块级别的作用域检查。在语句块中声明的变量只在块内有效。

For i = 1 To 10Dim p As LongSystem.Console.WriteLine(i.ToString())NextSystem.Console.WriteLine(p.ToString()) 这段代码在VB.NET中会得到一个编译错误,因为p在For..Next语句块之外不可访问。在VB6.0中这段代码可以通过。

改进了的类型安全

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

VB.NET不支持Any关键字。你必须指定每个参数和返回值的数据类型。数组VB.NET对数组作了明显的改动。

数组范围。在VB.NET中,你需要格外留意数组范围问题。VB6.0默认数组下界为0,故数组中的元素数量等与数组上界值加一。下面的数组界限从A(0)到A(10),共有11个元素:

Dim A(10) As Single可以使用Option Base改变下界值为1。在VB.NET中,数组和C++一样,下界值为0,不支持Option Base。注意:MSDN文档指出数组只能包括与其尺寸相等的元素数量,例如:Dim A(10) As Integer 只能包括10个元素(从A(0)到A(9)),但在编译下面这段代码时我发现它运行良好,看起来数组中容纳了11个元素。

Dim A(10) As Integer A(0) = 12 A(2) = 24 A(10) = 23 System.Console.WriteLine(A(0).ToString()) System.Console.WriteLine(A(10).ToString())System.Console.WriteLine(UBound(A).ToString()) System.Console.WriteLine(LBound(A).ToString()) Lbound和Ubound分别返回 0与10。ReDim和Fixed Array。你可以在VB6.0中指定固定长度的数组。

Dim ArrWeekDays(0 To 6) As Integer

这里的ArrWeekDays数组是固定长度的,不能用ReDim语句改变长度。VB.NET不支持固定长度数组,所以ReDim总是有效。

可以用下面两种方式声明数组: Dim ArrWeekDays(6) As IntegerDim ArrWeekDays() As Integer = {1, 2, 3, 4, 5, 6} ReDim语句。在VB6.0中,ReDim用于初始化动态数组。在VB.NET中你不能把它当作声明用。ReDim只能用于改变数组长度,不过不能改变数组维度。

Variant对阵ObjectVB6.0中的Variant数据类型能存储任意类型变量,VB.NET中Object具备相同能力。

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

操作符 常规语法 快捷方式加法 A = A+5 A +=5 减法 A = A – 5 A -+ 5固定长度字符串

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

布尔操作符VB6.0中的And、Or或是Xor语句是按位操作符。而在VB.NET中,它们是布尔操作符。执行这些操作将返回true或false。VB.NET引入新操作符来完成按位操作。

操作符 描述 BitAnd 按位AndBitOr 按位OrBitXor 按位XorBitNot 按位Not结构与自定义类型在VB6.0中,你使用Type…End Type语句块创建结构或自定义类型。例如:

Type StdRec

StdId As Integer

StdName As String End Type

VB.NET引入新的语法:Structure。Type…End Type不再被支持。Structure…End Structure与C++用法相同。可以指定结构中每个元素的可访问域,如Public、Protected、Friend、Protected Friend、Private等。例如:

Structure StdRec

Public StdId As Integer Public StdName As String

Private StdInternal As String End StructureVB.NET中的Structures就像类一样,也可以拥有方法和属性。New和Nothing关键字VB6.0中,AS New和Nothing关键字用于声明一个对象并初始化它。 VB.NET不支持隐式创建对象。如前所言,甚至连数据类型都是对象。你可以采用以下两种方法创建数据类型或对象: Dim i As Integer Dim i As Integer = New Integer() // Do something if i = Nothing Then End If 不支持Set语句VB6.0使用Set语句指派对象。例如:Set myObj = new MyObjectSet a = b在VB.NET中,不需要使用Set指派对象。例如:myObj = new MyObj()a = b过程(procedure)语法的变化在VB.NET中过程语法有了很多变化。例如类似C++的过程调用方式、ByVal(传值)为默认类型、Optional关键字、return语句等等。类似C++的过程调用方式 VB6.0允许不用加圆括号调用过程(sub)。不过,用Call语句调用函数或sub时,一定要使用圆括号。例如:Dim I as IntegerCall EvaluateData(2, i) EvaluateData 2, i 在VB.NET中,所有的方法调用都需要圆括号,而Call语句则是可选的。 ByVal是默认参数类型在VB6.0中,在调用函数或sub时ByRef(传址)是默认类型。那意味着所有改变将反映到传入的变量。VB.NET改变了这种方式。现在,默认的参数类型是ByVal(传值)。 Optional关键字VB6.0使用Optional关键字可用来让用户决定传入一个默认值,之后在调用IsMissing函数判断参数是否有效。 而在VB.NET中,每个可选参数必须声明其默认值,无需调用IsMissing函数。例如:Sub MyMethod(Optional ByVal i As Integer = 3)

Return语句VB.NET的Return语句与C++相似。使用Return语句把控制权从过程返还给调用者。在VB6.0中,Return语句与GoSub语句一起使用。VB.NET不再支持GoSub语句。流程控制的改变下面是VB.NET对流程控制语句的修改:1. GoSub不再受到支持。2. Call、Function和Sub语句均可用于调用过程。3. On ... GoSub和On ... GoTo语句不再受支持。可以使用Select Case语句来替代。4. While ... Wend语句现在改为While…End While语句。不再支持Wend关键字。小结 Visual Basic .NET是.NET版本的Visual Basic,已经从根本发生了变化!通过本文你了解到VB6.0和VB.NET的区别是很大的,可以说根本就是两种不同的语言,因为它们的内核发生了变化,VB6.0是基于COM而vb.net是基于.net框架的,因为这个变化,所以在构造类时也发生了根本性的变化。

学VB还是VB.net好?

细说VB.NET(上)

(作者:青苹果工作室编译 2001年03月07日 14:47)

微软公司提出的.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 版本里更容易、更迅速地创建

特定类型的功能。然而,你不一定要仅仅因为你能做到,就使用实现继承性或其它 .NE

T 功能。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、同样的表单引擎、同样的异常处理机制等等。这意味着Visua

l Basic和像 C#这样的语言拥有同等的地位,至少差不多是同等的。

回复:

细说VB.NET(中)

(作者:青苹果工作室编译 2001年03月07日 14:47)

易于反编译的中间语言

无论你用VB、C#或其它.NET语言编写应用程序,VS.NET代码都编译成为中间语言(I

L)。当应用程序运行时,一个即时编译器(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造成的体系结构差别要比跨语言集成、共享功能和被管理代码等深刻。首先,V

isual 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 Ho

llis 提供了语法变化的详细列表,包括废弃的关键字列表,但有些东西需要在这里重复

一下。

首先,向过程参数传递数据的默认方法由引用(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 S

et过程。注意 VB.NET 没有 Property Let 语句:对象和数值都用 Property Set。这意

味着你不能用一个 Friend Property Let 过程来对应一个 Public Property Get。用V

B建立组件时可能会有麻烦。许多组件开发者创建 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和Long

64。无论迁移到 VB.NET的移植工具是多么的好,它也不能改变开发者的记忆。为什么要

逼着我们再学一遍普通的数据类型呢?

最后,最需要的一个改变是:VB.NET引入了 Option Strict 关键字,你可以使用它

来代替 Option Explicit。Option Strict 结束了万恶的类型强制(tm),通过它VB乐于

让你把一个数值赋值给一个字符串,然后像犯罪一样做另一个操作。设置 Option Stri

ct 告诉 Visual Basic.NET 不要为你做任何类型强制。注意 VB.NET 并不是彻底的控制

狂,它允许类型向下转换,但不允许向上。例如,不使用像 sngvariable = CSng(dblv

ariable) 这样的语句进行显式类型转换,你就不能把声明为 Single 的变量赋值给声明

为 Double 的变量。因为这有丢失数据的风险。然而,你能不使用显式类型转换就把声

明为 Double 的变量赋值给声明为 Single 的变量,因为这并没有丢失数据的危险。使

用 Option Strict 能帮助开发者减少很多类型错误,包括那些很难调错的。但有一个附

加的缺陷:在工程里使用了 Option Strict 后,就不能进行 后编联了。

回复:

细说VB.NET(下)

(作者:青苹果工作室编译 2001年03月07日 14:47)

表单和新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设计表单并把代码添加到Initial

ize事件上,但你没有手段来控制这两点之间的过程。现在,表单就是一个类,它包含用

来建立表单所有的代码。我把这些代码称为肥料代码,因为大多数开发者希望远远离开

它们,越远越好。要想可靠地弄坏你的程序,没有比折腾这些代码更好的办法了。另一

方面,技术娴熟的用户可以通过这些代码做很多很酷的事,因为它让你能走到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的市场部门把W

eb服务列为采用.NET的几大理由之一。实际上,Web服务的本质就是使用标准协议的、由

Web服务器提供的、类似于COM的对象。注意在技术上它们并不是COM对象,但和COM对象

的表现方式很相像。Microsoft希望看到所有的公司使用Web服务,并且未来的应用程序

可以简单地“粘”在不同的Web服务上,就像现在可以使用Visual Basic for Applicat

ions (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.N

ET里同时提供了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开发者更简单地创建更有伸缩

性的高端应用程序。最后,它的成功将取决于开发者能多好地将它应用于现实世界。纵

观Microsoft在PDC和Beta 1版本之间的性能和稳定性上所跨过的这一步,我坚定地认为

:Microsoft走对了路!

VB.NET中的动态代码生成技巧

本文的讨论也将着眼于这两种情况 首先是当程序员需要动态建立一个控件并将代码附着于控件之上时 例如 你或许想创建一个链接列表 但是不知道需要创建链接的数量或是链接中会出现什么样的数据 第二种是当程序员需要定义代码以反映出特殊需求的时候 例如 你或许要执行能反映用户系统配置的代码

类似上述的情况当然不会每天都上演 事实上 它们只在非常情况下才出现 然而 作为程序员 仍然要意识到 NET为解决动态情形提供了方案 有了正确的技巧 你就可以写出能灵活处理动态情况的应用程序了

使用动态控件

许多程序员总会遇到需要动态创建控件的时候 我们所展示的例子中程序员向FlowLayoutPanel中添加了LinkLabels 或许你可以个这样的设置来记录和保存常用的URL 文件 网络地址或是其他资源所在位置的数值 这一示例没有真正保存链接 但是你可以使用XML序列化功能来实现保存

每次当用户点击Test按钮时 示例代码就会动态创建一个新的LinkLabel控件 真正的演示代码并不复杂 例一就展示了创建这类控件以及将控件放入FlowLayoutPanel lstLabel中通常所需要做的一切

例一 向FlowLayoutPanel中添加新的链接  Private Sub btnTest_Click() Handles btnTest Click   Create a link  Dim NewLink As LinkLabel =New LinkLabel()   Add some properties to it  NewLink Text = DateTime Now  ToLongTimeString()   Set the click event handler  AddHandler NewLink Click  AddressOf NewLink_Click   Place the button on the form  lstLinks Controls Add(NewLink) End Sub

如你所料 该代码开始的时候创建了一个新的LinkLabel并为其赋予了一些值 这一示例使用的是当前时间 你的代码或许能够对某一真实资源进行访问

请注意该代码也向链接的Click事件中指定了一个处理程序 你必须使用示例中的AddHandler技巧 因为普通的Handles关键词路径不起作用 一方面 设计应用程序的时候你并不清楚控件的名称 即便你为控件指定了一个名称 你也不知道用户要创建的控件数量 所以我们没有办法清楚会有多少处理程序会被创建 处理程序的代码与控件代码类似 因此没有必要创建多个处理程序 用于这个示例的处理代码见例二 例二 处理动态控件点击事件  Private Sub NewLink_Click( _ ByVal sender As System Object  ByVal e As System EventArgs)  Verify that you actually have a LinkLabelIf Not sender GetType() Is GetType(LinkLabel) ThenMessageBox Show( Wrong control type provided! )ReturnEnd If  Convert the input sender to a Button Dim ThisLink As LinkLabel = sender   Show that we have the correct button MessageBox Show( You created this link at:   + ThisLink Text)End Sub 

你可能已经注意到例一中的事件处理器使用的是宽松代表——它没有将ByVal发送器作为System Object 也没有将ByVal e作为System EventArgs作为参数因为它不需要这二者 然而 当你创建一个事件处理器来动态创建控件时 通常你需要将ByVal发送器作为System Object参数 这意味着将这两者都包含其中

有些程序员在创建事件处理器的时候会出现一个错误 即没有检查传入控件的类型 发送器对象可能包含多选择 而如果未对事件处理器进行事件处理类型的设置 那么你就会面临更多的选择 我们的示例代码一开始就检查了传入控件对象的类型 这样以来发送器就不会像下面所展示的代码一样  Private Sub btnTest _Click() Handles btnTest Click   Create a link Dim NewButton As Button = New Button()  Add some properties to it NewButton Text = DateTime Now ToLongTimeString()  Set the click event handler AddHandler NewButton Click  AddressOf NewLink_Click  Place the button on the form lstLinks Controls Add(NewButton)End Sub 

此代码在FlowLayoutPanel中创建了一个按钮 大多数情况下这都能正常运行 除非事件处理器不按照按钮所示的进行操作 如果你打算服务多个控件类型 那么每个控件类型都需要一个独特的处理 你可以使用多事件处理器或者为某些类型提供选择标准

NewLink_Click()事件处理器照常将传入发送器转换成指定类型 在这个示例中则是LinkLabel 该代码可以访问LinkLabel属性并能用其他方式进行互动 在我们的示例中 只显示了一个能在创建链接的时候告知我们的对话框

使用动态代码

在运行时创建一个控件是在无法确定应用程序功能的时候采取的一种策略 但是动态创建控件并不适用于所有的情况 有些时候你必须建立可执行代码 虽然你的应用程序运行的目的是补偿不同极其之间的配置 不同用户的需求 不同的环境需求或是其他要求 当应用程序所运行的电脑不存在控件 那么通常是需要创建动态代码的

幸运的是 NET为我们提供了一系列动态代码选项 例如 你可以创建一个可执行的能独立运行的程序或是可以想运行中的程序加载一个DLL然后再执行 当你需要演示一个外部任务的时候可以使用选择可执行 如运行一种脚本——该DLL选项最适合扩大现有的应用程序功能

你可以运行来自文件或内存的动态代码 当你需要不止一次地运行代码时 可以使用文件 对代码的检查可以再次运行外部文件而不需要对其进行二次编译 当你需要多次演示任务的时候 如一个安装请求 那可以使用内存图像

当然我们也可以更改源代码 例如 你可以使用字符串来建立需要在应用程序中直接使用的代码 如果你需要代码具有高度灵活性 且代码本身不是很长时 这一方法的优势就非常显著 也可以从文件里建立代码 就如同VS一样 这一方法最适用于相对稳定且不需要复杂编码的需求 第三种选择是使用Documentation Object Model来创建代码并将其作为CodeDom树型结构的一个系列 该树型结构包括了CodeCormpileUnits 这就像是用DOM模式创建了一个XML文件

使用动态创建代码的最好方式是用示例来检查一下 例三展示了一个基本 Hello World 示例 该示例用源代码直接创建了代码因此你可以看到整个运行以及生成一个外部可执行文件的过程

例三 动态编码示例  Private Sub btnTest _Click() Handles btnTest Click   Create a piler Dim Comp As VBCodeProvider = New VBCodeProvider()  Define the parameters for the code you want to pile Dim Parms As CompilerParameters = New CompilerParameters)   We do want to create an executable  rather than a DLL Parms GenerateExecutable = True   The piler will create an output assembly called Output Parms OutputAssembly =  Output    The piler won t treat warnings as errors Parms TreatWarningsAsErrors = False   Add any assembly you want to reference Parms ReferencedAssemblies Add( System Windows Forms dll )   Define the code you want to run  Dim SampleCode As StringBuilder = New StringBuilder() SampleCode Append( Imports System Windows Forms  + vbCrLf) SampleCode Append( Module TestAssembly  + vbCrLf) SampleCode Append( Sub Main()  + vbCrLf) SampleCode Append( MessageBox Show(  + Chr( ) + _ Dynamically Created Code!  + _Chr( ) +  )  + vbCrLf)SampleCode Append( End Sub  + vbCrLf)SampleCode Append( End Module  + vbCrLf)  Define the code to run Dim Executable As CompilerResults = _ Comp CompileAssemblyFromSource(Parms  SampleCode ToString())  Display error messages if there are any If Executable Errors HasErrors ThenFor Each Item As CompilerError In Executable ErrorsMessageBox Show(Item ErrorText)NextElse  If there aren t any error messages  start the  executable Process Start( Output )End IfEnd Sub 

一开始你创建了一个使用VBCodeProvider的编译器Comp 旧一点的 NET版本使用的是不同的方法但是这里所讲的是微软推荐的一个新方法

为了使用编译器 你必须创建能描述应用程序的参数 这些参数类似于VS中你创建的参数 只是现在你可以对它们进行定义 该代码一开始就将GenerateExecutable设置为True 这意味着你需要的是一个EXE文件而不是DLL

Parms OutputAssembly属性包含了输出文件的名称 你只需要在想创建文件时提供这一信息即可 而不需要生成可执行内存了 如果你ixiang生成可执行文件的内存版本 可以将Parm GenerateInMemory属性设置为True

使用Parm TreatWarningsAsErrors属性来确定如何处理警告信息 默认的设置会使其为错误 这意味着你的应用程序可能无法对其进行编译 大多数程序员使用默认设置 尽管他们开发了程序 但是在开发完成的程序中却将其设置为False

大多数应用程序需要外部DLL以正常运行 当然 你不能创建任意的没有引用外部DLL的Windows表单程序 通常 你要使用Reference文件夹来完成这一任务 不过 当你动态创建代码的时候可以依赖于Parms ReferencedAssemblies属性 如下所示 只需添加你要的DLL即可

现在 你已经定义了项目 接下来需要为其创建源代码 如前文所述 你可以依赖于一个外部文件或DOM模式 然后 该示例创建了代码因此你可以看到整个过程 下面是代码的原始形式  Imports System Windows Forms Module TestAssemblySub Main()MessageBox Show( Dynamically Created Code! )End SubEnd Module 

这个简单的例子显示了一个对话框 注意vbCrLf的使用 如果你不使用这一方法 那编译器会发送给你一个错误信息 vbCrLf条目在该代码中所起的作用与在程序代码中的作用相同 只是添加的方式不一样

从这一点老说 你最后会用Comp CompileAsseblyFromSource()方法编译代码 当使用DOM模式和文件的时候可以使用这一方法 而在所有三种情况中 编译器用参数和源代码创建了你请求的输出 该运算的输出出现在Executable中 是CompilerResults类型

编译的失败次数多于程序员的预计 无论你是在哪里使用动态编码技巧 你必须假设会出现失败的情况以及处理失败的方案 在本例中 代码寻找的是错误并在编译失败时将其展示在了信息框中 否则 代码会依赖于Process Start()方法来启用可执行文件

底线

动态编码技巧并不是万能钥匙 当你为开发问题找到了好的静态解决方案时 当然也可以使用 但是在我们所列出的情况中没有可行的静态方案 因此要选择动态编码技巧 大多数情况下 要用动态编码技巧解决以下问题

◆ 用户的环境会以不可预见的方式更改时

◆ 无法控制用户电脑的安装

◆ 用户或应用程序都添加了你要用控件执行的数据要素

◆ 应用程序必须执行很早以前的安装任务 且这些任务与电脑 环境 网络或其他不确定因素联系紧密时

◆ 应用程序要执行了处理级别的任务 且这些任务取决于机器连接或其他状况

lishixinzhi/Article/program/ASP/201311/21812


本文名称:vb.net且或非 vbs 与或非
分享路径:http://lszwz.com/article/hjdihp.html

其他资讯

售后响应及时

7×24小时客服热线

数据备份

更安全、更高效、更稳定

价格公道精准

项目经理精准报价不弄虚作假

合作无风险

重合同讲信誉,无效全额退款