包含.netvbc的词条

一文搞清到底什么是 NET其实几句话就能搞清楚.net 。
我们知道我们使用C#/VB写的代码是源码,如果这个源码你写在记事本中也是一样的 。
然后使用csc.exe/vbc.exe把你的源码编译 。生成的文件就是IL文件(可能为dll或exe后缀的) 。
事实上,我们如果在记事本写是一样的,这个记事本叫编辑器 , 你需要一句句地把代码写出来 。如果我们记事本象notepad 一样能带一个高亮语法的标识多好?当然了,如果能有自动补全更好(一个关键词或声明的变量之类的,打出几个字母就提示出来,我们可以提高输入速度的,录入速度与打字速度这里有区别了,很多程序员以为自己输入速度很高,进而以为自己的打字速度很高 , 其实不是我经常说程序打字速度并不快不需要机械键盘就是因为这个,并不是说输入速度低),这些功能都加上,就是VS(vs其实是一个IDE , 开发集成工具,而编辑器就是其中一个,智能感智——自动补全功能加强版,高亮显示等都是编辑器的插件被集成进来),而模板(自动给你增加using代码与部分文件名称等等)则是把常用的一些句子先给你输入好 , 等等集合起来 , 就把编辑这部分完成了 。
当然了,你安装完之后会看到类似于csc.exe与vbc.exe这类的编译器的,它可以把你的源码(文本)编译成IL语言 。不幸的是csc/vbc的参数太多了,输出输入选项等等,谁也记不住?。愿菸谋咀橹?,自动生成一个csc参数使用的命令多好?嗯,想法不错的,这就是VS中另一个功能,他所谓有的编译F6等等都是按你的项目组织自动生成一条编译指令来调用编译器(csc编译c#的,vbc编译vb的),VS不但可以自已选择合适的编译器(根据后缀名),而且对于项目中某个参数,自动调用csc.
好了,怎么把源码变成IL呢?这里要用到一个东西 , 我们叫.net framework,不要把framework理解成模板,不要以为你选择.net framework版本之后可以选择不同的模板,其实它才是把源码变成IL的标准——模板不同是因为针对于不同的语法糖进行不同的翻译 。比如一个例子using语句块其实就是try-finally块,不同的framework中使用不同的类库与语法糖 。换句话来说,开发中所增加的都是使用基本类库与语法糖的增加 。
比如.net framework 4.5中存在一个运算符,(?.)运算,它就会在.net framework 4.5时会映射到正确的IL语言 。而在.net framework 4.0中却不会认识该运算符 。当然了 vari?.Attribute1与.net framework 4.0中vari==null?null:vari.Attribute1的结果是一样的 。虽然.net framework 4.5比4.0增加了不少的东西,它其实只是方便了你写的源码,IL指令并没有任何的增加!
所以呢每当.net framework版本增加时,其实只变化了一些我们编码时的语法或语法糖而已!并附带送给我们几个模板或新开发几个模板而已 。比如MVC/web api等等模板 。
说完了生成,现在再说一下IL是怎么运行的,IL其实并不能直接运行,我们需要一个标准把IL再"映射“成可运行的二进制(机器语言),源码”映射“成IL使用的是.net framework,而IL映射成二进制需要的是.net,不同的是我们把源码”映射“IL叫编译,使用的是.net framework,也叫编译态,而IL映射成二进制并运行,这个叫运行态 。所以我们称两个的区别一个叫开发环境,一个叫运行环境 。如果按照正常的理解 , 其实我们一个用的是.net framework 4.X,运行时我们安装的dotnet4f,是运行环境 。
运行环境的虚拟机就是为了把IL映射成二进制(Native Image) , 而且我们会保存起来 , 当然了,下次使用相同的IL时,直接使用Native Image中已保存的,不再执行翻译了,这个就是运行时的机制 。
大多数时间很多人把开发环境与运行环境弄混了,为什么呢?因为我们开发时避免不了要测试及运行,所以开发环境包含了运行环境(你安装.net framework时同时会安装运行环境),而不需要开发的人员比如如使用windows 10中已经安装了部分的.net 运行环境支持 , 所以他们也不需要了解这个东西 。只在在出现类似.net framework 4.0在vista版本中运行时,就需要给vista非开发机安装.net framework运行版本 。否则不需要 。所以很多人把开发环境与运行环境混在一起理解了 。
事实上 , .net framework 2.0/3.5开发的软件,生成了IL标准都是2.0的,所以我们只需要2.0的运行环境 。而.net 4.0及4.x.y都使用的是.net 4.0的运行环境 。
说白了,.net有开发版本,而framework相当于编译时使用的标准 。而IL的标准则是MSIL , 也叫是我们常说的CLS,而把运行态叫CLR(公共语言运行时)是虚拟机要执行的标准 。
所以,其概况非常简单,.net支持多种语言,多种语言都是可以生成IL依赖于不同的编译器 , 比如csc/vbc等 。可以让不同的语言开发者在同平台下工作 。而IL(中间语言)再由虚拟机在不同的机器上翻译成不同的机器语言,保证了其移植性 。包括现在支持的linux新标准也是如此方式 。跨平台则使用是native image方式 。
分清这两个步骤 , 那么.net就没有什么神密的了 。
告诉你几个事实,有助于理解问题 。
C#生成的IL可以被反射成VB语法!当然反向也可以!Red gate的reflector已被MS收购 。可以试试的,原来的ILDism已被基本放弃了!它是早期做为VS的插件工具出现的 。当然ILSpy也是不错的,那只是一个反射工具而已 。请细想为什么C#生成的IL可以反射成VB语言(反射的准确度与各家软件的功能有一定的关系)00
.net framework 4.0的生成的IL可以被反射成4.7.2的语法!想想这是为什么?如果你运行环境与编译环境搞混的话,假定IL中也有4.7.2的运行环境,那么怎么可能版本之间相互反射?但是,.net 2.0生成的IL反射成.net 4.0会存在问题,.net 4.0生成的IL反射成2.0会会现很多错误!其实.net 4.0并不包含.net 2.0的语法集,所以这两个运行版本并不兼容,反射软件只会把相同的部分反射出来,不同的部分就难以反映了!.net 2.0反射4.0的结果要好点,这是因归功于.net framework为了降低学习成本,有一定的连续性,但是这种连续性在高版中部分.开发使用的C#语法被放弃(放弃与清除是不同的,放弃还能反射出来,清除的却无法再反射了) 。
搞清这些就能搞清楚.net的两段三步(两段开发段/运行段,三步,源码语法(C#/VB),IL语法(MSIL), 二进制(可运行的机器语言)) 。
vb和vb.net是一样的吗?有什么不同?1、从OOP概念上讲.netvbc,VB不是一个真正.netvbc的面对对象的语言.netvbc,他不支持继承等一些面对对象的特性 , 而VB.net是一个面对对象的语言,支持这些特性
2、VB和VB.net都可以用来网络编程的,这点可以肯定,两者都有这个功能
VB是通过控件进行网络编程,而VB.net可以通过VB的控件,也可以是用.net框架提供的system.net命名空间下的所有的类
3、正确理解VB.net中的.net , .NET 是微软推出的一种新的编程思想和模式,对于网络提出了一个新的概念(当然功能有了很大的革新),微软在.net 框架中规定了通用语言规范,只要符合这个规范 , 都可以利用.net强大的功能来完成任务,比如delphi.net ,他是.net和通用语言规范结合的产物,.net 框架提供了好多功能,简单列出一些命名空间
System 包含所有的数据类型和...
System.IO包含Windows文件 , 数据流的访问操作和...
System.Net包含网络有关的各种协议TCP,UDP等等和...
System.Text包含字有关的,比如经典正则表达式
System.Data包含访问数据的所有的类
System.Web包含Web有关的 , 比如Web Services的新概念
System.Drawing包含GDI 的所有功能,可以绘制图形
System......等等
当然还包括Microsoft.VisualBasic等微软产品的系列的命名空间
这些命名空间可以用于所有.net的应用程序,比如可以用System.Drawing包含GDI 的所有功能来Web上动态的设计图表
而实现它就可以用VB.net的语言
4、可以宽泛的来解释就是:VB.net=VB(OOP) .net
5、VB.net的运行方式和VB不同,比如VB就是通过一个DLL动态链接库文件来编译的,而VB.net是先生称MSIL(微软中间语言)代码,然后通过通用语言运行时,将MSIL继续编译生成更好更高效的代码 。这位朋友可以试着用一下.net下的vbc.exe编译工具,写个小程序编译下试试
6、两者语法相同,但有少许差异,VB.net的运算符和一些错误处理机制多了一些
7、VB和VB.net最擅长用于快速开发 , 不需要太过于考虑性能的快速开发,但是VB.net和其他语言的功能天生是相等的,现在的VB.net用于Web应用程序,WinForm应用程序开发的情况就比较多,而其他应用我不是很了解或一时想不出来 , 我有个朋友就是用.net做嵌入式开发的 , 但他们公司也用.net 做3G开发
8、狗屁六级的vrhero,“VB.NET也是VB”还在这儿放这么多废屁,这样的人就是没事找抽型 把你的6个问题也给解释一下,1、smalltalk是纯粹的OOP语言,Java 惖腛OP , VB不支持OOP的特性,所以不完全是,够明白了吧2、完全不知所云---我写的这些不是拷过来的,不能说我不知所云3、我只是把我经常用到的命名空间告诉这位朋友不为过4、误人子弟,屁话5、屁话6、笔误,是我的错7、你用VC开发web给我看看,相比VB.net和C#看看那个快 , 各种语言都各有所长,不是我说的,微软.net系列清华出版的这么多书,那本不都有说明吗?你补充的那几句,学过.net的人都知道,没有实用价值 。
“除了语法和使用习惯的继承,VB 6.0之前的版本和VB 7.0之后的版本完全没有联系,几乎没有相同之处,两种不同体系的语言”和“VB.NET也是VB ”这种自相矛盾的话,就认为这位高级经理是大脑发热,笔误吧!
vb和vb.net的区别VB.NET和VB6.0有什么区别
Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一 。.NET版本.netvbc的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C).netvbc的编程语言 。本文将介绍VB.NET.netvbc的新特性 , 并比较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按类别定义 。微软借用了Cclass 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 = "https://www.04ip.com/post/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 = https://www.04ip.com/post/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 5A=5 减法A = A – 5A -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框架的 , 因为这个变化,所以在构造类时也发生了根本性的变化 。
ASP.NET设计控件净化网站语言一 概述
考虑一下这种情形 你为一个Web网站写了一个应用程序 它的功能是接受用户的输入并将输入内容永久保存 例如保存到数据库 另外还要在网站上显示出用户输入的内容 例如论坛就是一个很典型的例子
如果用户来源很杂 必须考虑如何防止用户提交和张贴攻击性(或者色情的 庸俗的)的内容 可能的解决方案包括
⑴ 将用户群限制到一个封闭的用户团体 即要求用户使用程序功能之前必须先注册/登录 这样 由于每次提交的内容都可以追查到提交者 用户破坏网站规则的可能性就小了很多 如果有用户做出了不应该做的事 你就可以核实用户身份 予以相应的处理
⑵ 在网站上发布用户提交的内容之前 先由管理员审阅 很多时候 由于人力资源有限 这个办法不一定行得通
⑶ 禁止用户提交攻击性内容 这是最理想的解决办法 把问题解决在起源 但具体应该怎么实现呢?
本文介绍的方案以一个复合控件为基础 利用一个XML文件来定义攻击性词语 .netvbc我们将用VB NET编写这个复合控件 用普通的文本编辑器和命令行编译器(vbc)完成整个工程的构建
在正式编写控件之前 首先我们来简单地回顾一下ASP NET中控件的概念 本文出现的所有控件都是服务器控件 它们在服务器上运行 将HTML代码发送到客户端 要理解控件的分类 可以从控件是否嵌入到Web表单页面(因而采用按需编译方式)或预先编译的角度来观察 微软定义了下列ASP NET服务器控件 HTML服务器控件 Web服务器控件 验证控件 用户控件
前三种控件读者应该已经比较熟悉了 对于开发者来说 它们是最简单的控件类型 在ASP NET中已经由微软为我们编写好 用户控件则有所不同 用户控件是 包装 成 ascx页面形式的 aspx页面 其.netvbc他 aspx页面可以通过注册和实例化来调用用户控件的功能 这是一种被寄予厚望的服务器端控件 对于ASP/ASP NET开发者来说 它代表着一大进步 特别地 现在编写控件的语言已经全面支持面向对象技术
ASP NET用户控件由一个或多个服务器控件 静态HTML元素构成 可以包含额外的代码 每个用户控件封装一组特定的功能 用户控件可以通过简单地扩展现有服务器控件(控件组)得到 例如 带有旋转功能的图形控件 在文本框中保存日期的日历控件
二 开发复合控件
控件要检查用户提交的内容是否包含 攻击性 词语 攻击性词语由一个XML文件定义 XML文件的结构如下
<?xml version= ? encoding= GB ><words><word>词语一</word><word>词语二</word></words>
本文的复合控件(Composite)包含三个ASP NET服务器控件 一个Textbox控件 一个Label控件 还有一个Button控件 当用户点击Button控件 Composite检查用户提交的文本是否包含了XML文件中指定的词语(XML文件的默认名字是bad_words xml 通过一个自定义属性定义) 并抛出一个自定义事件 另外 Composite控件还将它的Label子控件的一个Text属性显露成顶级属性
复合控件可以有选择地将子控件显露成属性 或者有选择地将子控件的属性和事件作为顶级属性和事件显露出来 当复合控件整合来自子控件的属性时 它通常只是简单地委托子控件执行操作 如下面的例子所示
// 将操作委托给标签对象 标签对象是一个// System Web UI WebControls Label的实例Public Property Text() As StringGetEnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd Property
我们需要一个文本输入框让用户输入内容 一个按钮来提交表单 还要一个向用户反馈信息的文本标签 下面我们来看看Web表单的代码 复合控件就是在这里实例化的
【posite aspx】
<%@ page language= vb debug= false trace= false %><%@ Register TagPrefix= Custom Namespace= CustomControls Assembly = CustomControls %><><script language= VB runat=server>Private Sub CheckText(sender As Object e As CheckEventArgs)If e Match = false ThenComposite Text = <h >发布内容请遵守本站规则!不得发布攻击性言辞?。?h > ElseComposite Text = 你提交的内容已通过检查! End IfEnd Sub </script>
<body>
<h >语言净化控件实例</h ><br><form runat=server><Custom:Composite id = Composite OnCheck = CheckText filename = bad_words xml runat = server/></form></body></>
上面的代码首先注册指定的复合控件 我们将把控件的代码编译成一个 dll文件 放入应用的bin目录 这是ASP NET首先搜索的位置 在Web表单构成的用户界面中 我们实例化了自定义控件 同时指定了
⑴ 当控件抛出OnCheck事件 执行一个本地的子过程CheckText 我们把复合控件的标签的文本通过一个公用属性显露出来 标签的内容由OnCheck事件句柄设置的另一个公用属性决定
⑵ 定义攻击性词语的XML文件的名字
⑶ 另外 我们还定义了一个由复合控件调用的CheckText子过程
现在来看复合控件本身 复合控件有两个类 用两个独立的VB源文件实现 分别是posite vb和checkevent vb
【posite vb】
Imports SystemImports System WebImports System Web UIImports System Web UI WebControlsImports System XmlImports System Collections
Namespace CustomControlsPublic Class CompositeInherits ControlImplements INamingContainerPrivate _filename As String = bad_words xml Private label As LabelPrivate box As TextBox
Public Property filename() As StringGetReturn _filenameEnd GetSet_filename = valueEnd SetEnd Property
以用户提交的文本内容为输入参数 如果用户提交的内容包含攻击性言辞 则返回修改后的版本 否则 直接返回原始的文本 Public Function CheckString(InputString as String) as stringDim alWordList As new ArrayListdim xmlDocPath as string = mappathsecure( bad_words xml )dim xmlReader as XmlTextreader = new xmlTextReader(xmlDocPath)dim element as stringdim output as stringdim asterisks as string = *************************
将定义攻击性言辞的xml文件内容读入到一个ArrayLishile (xmlReader Read())if xmlReader NodeType=xmlNodeType Text thenalWordList Add(xmlReader Value)end ifend whilexmlReader Close()
检查用户提交的文本内容 将攻击性言辞替换为适当数量的星号For Each element in alWordListInputString=InputString Replace(element asterisks substring( (element length)))Next
Return InputString
End Function
Public Property Text() As StringGet 该方法首先检查ChildControlsCreated属性的当前值 如果该值是false 则调用CreateChildControls方法EnsureChildControls()Return label TextEnd GetSetEnsureChildControls()label Text = valueEnd SetEnd Property
Public Event Check As CheckEventHandler
Protected Overridable Sub OnCheck(ce As CheckEventArgs)RaiseEvent Check(Me ce)End Sub
创建Composite控件的子控件Protected Overrides Sub CreateChildControls()
Controls Add(New LiteralControl( <h >请在下面输入文字内容: ))
文本输入框Dim box As New Textbox()box Text = Controls Add(box )
Controls Add(New LiteralControl( </h > ))
按钮Dim button As New Button()button Text = 提交 Controls Add(New LiteralControl( <br> ))Controls Add(button )
将一个事件句柄加入新创建的按钮对象AddHandler button Click AddressOf Me ButtonClicked
Controls Add(New LiteralControl( <br><br> ))label = New Label()label Height = Unit Pixel( )label Width = Unit Pixel( )label Text = Controls Add(label)End Sub
Protected Overrides Sub OnPreRender(e As EventArgs)CType(Controls( ) TextBox) Text = End Sub
Private Sub ButtonClicked(sender As [Object] e As EventArgs)OnCheck(New CheckEventArgs(CType(Controls( ) TextBox) Text CheckString(CType(Controls( ) TextBox) Text)))End SubEnd ClassEnd Namespace
上面代码的主要任务是
⑴ 首先导入必要的名称空间 声明当前类所属的名称空间
⑵ 接下来定义Composite的主体 Composite从最基本的Control类继承 另外还要实现INamingContainer接口 INamingContainer接口允许Composite控件将事件转发到它的Button子控件
⑶ 用CreateChildControls方法(而不是OnInit或构造函数)创建子控件
⑷ Composite控件没有显露出Button子控件的Click事件 相反 它处理了Click事件 并抛出自定义事件Check
⑸ Composite控件显露了下列公用属性 Text 即Label子控件的Text属性值 FileName 允许获取和设置定义攻击性词语的XML文件的名字
⑹ 主要的检查功能由CheckString方法实现 它的输入参数是一个文本字符串 CheckString方法从XML文件读取禁用的词语 放入一个数组列表(ArrayList) 然后检查指定的字符串是否包含禁用的词语 所有 攻击性 的词语将被适当数量的 * 替代
⑺ OnPreRender清除文本框子控件的文本
⑻ 当用户点击按钮 ButtonClicked开始执行 ButtonClicked调用onCheck子过程 传入适当的参数(一个新建的CheckEventArgs对象 创建CheckEventArgs对象的参数是检查前和检查后的文本) OnCheck随后触发一个事件 该事件将由 aspx页面中的代码处理
【CheckEvent vb】
包含定制事件数据类CheckEventArgs的代码 另外还定义了Check事件的事件句柄Imports SystemNamespace CustomControlsPublic Class CheckEventArgsInherits EventArgsPrivate _match As Boolean = False
Public Sub New(string As String string as String)If string =string Then_match = TrueEnd IfEnd Sub
Public ReadOnly Property Match() As BooleanGetReturn _matchEnd GetEnd PropertyEnd Class
Public Delegate Sub CheckEventHandler(sender As Object ce As CheckEventArgs)End Namespace
CheckEventArgs的构造函数是两个字符串 根据字符串的值设置相应的匹配标记_match 另外 上面的代码还定义了CheckEventHandler事件句柄
编写好上面的代码后 如果你没有安装IDE 用下面的命令执行编译即可
lishixinzhi/Article/program/net/201311/15751
为什么进程里一出现vbc.exe时,带有VBA1、VBC.EXE是VBE编辑器 , 可能你的EXCEL有问题了
2、vbc.exe在xp的路径是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 。如果是VBE编辑器,没理由出现在这个文件夹位置 。出现在这个位置都是与.net有关的东西 。
3、VBE没有单独的进程,还是在EXCEL.EXE里 。
4、应该是.NET的东东了 。是SYSTEM的进程了 , 不是你打开的 。
关于.Net和VB6中Socket的问题类库System.Net.Sockets
举两个示例
1、服务器端程序(DateTimeServer.vb)
-------------------------------
Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading
Imports System.Globalization
Public Class DateTimeServer
Public Shared Sub Main()
Dim now As Date
Dim strDateLine As String
Dim ASCII As Encoding = Encoding.ASCII
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
Try
Dim tcpl As New TCPListener(13) '在端口 13 上进行侦听
tcpl.Start()
Console.WriteLine("正在等待客户端连接")
Console.WriteLine("按 Ctrl C 退出...")
While (True)
' 接受将阻塞,直到有人连接
Dim s As Socket = tcpl.AcceptSocket()
' 获取当前日期和时间,然后将
' 其连接为字符串
now = DateTime.Now
strDateLine = now.ToShortDateString()" "now.ToLongTimeString()
' 将该字符串转换为 Byte 数组并发送它
Dim byteDateLine() As Byte = ASCII.GetBytes(strDateLine.ToCharArray())
s.Send(byteDateLine, byteDateLine.Length, SocketFlags.None)
s.Close()
Console.WriteLine("已发送 {0}", strDateLine)
End While
Catch socketError As SocketException
If (socketError.ErrorCode) = 10048 Then
Console.WriteLine("连接到此端口失败 。有另一台服务器正在此端口上侦听 。")
End If
End Try
End Sub
End Class
2、客户端获取服务器端的时间(Client.vb)
Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class Client
Public Shared Sub Main()
Dim tcpc As New TCPClient()
Dim read(35) As Byte
Dim args As String() = Environment.GetCommandLineArgs()
If (args.Length2) Then
Console.WriteLine("请在命令行中指定服务器名称")
Exit Sub
End If
Dim server As String = args(1)
' 验证服务器是否存在
Try
DNS.GetHostByName(server)
Catch
Console.WriteLine("无法找到服务器:{0}", server)
Exit Sub
End Try
' 尝试连接到服务器
tcpc.Connect(server,13)
' 获取流
Dim s As Stream
Try
s = tcpc.GetStream()
Catch exc As InvalidOperationException
Console.WriteLine("无法连接到服务器:{0}", server)
Exit Sub
End Try
' 读取流并将其转换为 ASCII
Dim bytes As Integer = s.Read(read, 0, read.Length)
Dim Time As String = Encoding.ASCII.GetString(read)
' 显示数据
Console.WriteLine("已接收到 {0} 个字节", bytes)
Console.WriteLine("当前的日期和时间为:{0}", Time)
tcpc.Close()
' 等待用户响应以退出
Console.WriteLine("按 Return 键退出")
Console.Read()
End Sub
End Class
3、将这两个文件保存,然后进入.net提供的编译工具---Visual Studio .NET 2003 命令提示
vbc.exe /target:exe /out:DateTimeServer.exe /r:System.dll DateTimeServer.vb
vbc.exe /target:exe /out:Client.exe /r:System.dll Client.vb
编译成功后,生成两个exe文件,打开服务器端的DateTimeServer.exe程序 , 用于监听客户端的请求
在MS-DOS命令行中敲入命令Client.exe Localhost
就可以看到效果了
【包含.netvbc的词条】关于.netvbc和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读