十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Public Property id() As String :定义 id() 数组的属性:Public Property :可读也可写性
创新互联是一家业务范围包括IDC托管业务,雅安服务器托管、主机租用、主机托管,四川、重庆、广东电信服务器租用,四川雅安服务器托管,成都网通服务器托管,成都服务器租用,业务范围遍及中国大陆、港澳台以及欧美等多个国家及地区的互联网数据服务公司。
Get
Return Kabuid
End Get
Set(ByVal value As String)
Kabuid = value
End Set
End Property
Property是属性的意思,您这里Public Property id() As String:意思是id()这个数组是可读也可写的属性。还有Public ReadOnly Property:只读性;Public WriteOnly Property:只写性
C 和 Pascal 曾经不太像,但是越来越像。
现代 C 语言借鉴了很多 Pascal 的概念:
例如,古老的 C 语言的类型检查很弱,没有函数原型。但今天的 C/C++ 语言支持函数原型(而且不提倡用旧的函数风格),类型检查机制几乎和 Pascal 一样严格。古老的 C 语言曾经只能靠指针存取外界的变量,很不安全,但今天 C/C++ 的引用参数则是相当类型安全的。而引用参数和 Pascal 的 var 参数如出一辙。
另外,Pascal 语言本身也经过了巨大的发展,Borland 功不可没。
今天人们用的 Pascal 几乎就是 Turbo Pascal 或 Delphi 的 Object Pascal。N.Wirth 时代的
program Name(input, output);
const a = 1;
type t = packed array of char;
var i: integer;
begin
writeln('这是一个古董Pascal程序');
end.
还有几个人认识?一个软件就是一个 program begin end,不能分模块,岂不要疯掉?
现代 Pascal 语言也借鉴了许多 C 语言的概念,如缺省参数值、无变量变体记录:
type
TPoint = record
case integer of
0: ( x, y: extended );
1: ( radius, angle: extended );
end;
case 部分不是 case type: integer of 而是 case integer of,实际上跟 C 语言的 union 一样了。
至于借鉴的数据类型(如 smallint, longint, 无类型指针 Pointer,类型参数)和强制类型转换机制,就更不用提了。
今天 Pascal 的文件处理,也有点模仿 C 语言,跟以前是天壤之别,谁还记得 Old Pascal 的 get/put 操作?
说这么多相似,其实也衬托了当年的不相似。语言的发展趋同,不同的( {} 与 begin..end )往往都是鸡毛蒜皮。
今天还有的比较重要的区别:
1. Pascal 支持子程序嵌套,C 否。因为 C 的设计目标之一就是与机器语言的结构直接对应。
2. Pascal 子程序分过程/函数,C 只有函数。
3. Pascal 类型更严格,如 char, boolean 都是特殊的枚举类型,而枚举与整型不是一回事,必须用 Ord() 转换。
而 C 的 char、enum 都被当作整型。
4. C 支持可变参数 void f(int x, ...),Pascal 没有。
5. C/C++ 的模块机制是头文件的文件包含+*.obj文件的连接,文件包含属于文本操作,编译速度很慢。而 Pascal 是 unit 的连接,二进制操作,编译速度飞快(对开发大型软件还是很重要的)
6. C 语言的结构/数组的初始化只用给出数值,而且元素个数可以比定义的少;而Pascal必须明确指出分量名称,个数严格对应:
var Point: TPoint = ( x: 100, y: 200 );
7. C 的标志符大小写敏感,Pascal 否。
8. C 编译预处理功能比 Pascal 的强大,实践中也很重要(它弥补了 C 编译器的许多不足)。
9. 很容易被忽视也很重要的一条:两者的表达式不同。
9.1. C/C++ 的表达式被赋予了太多的使命,连赋值语句本身也是表达式,a = b 同时返回 a,因此可以写 a = b = c; 而 Pascal 对赋值号被严格当作一个规定好的操作:赋值,别无其它,你不能写 a := b := c。
9.2. C/C++ 的表达式的类型严格取决于源操作数: char a = 100, b = 200; 则 a+b 的结果类型仍然是 char,当然就会溢出。Pascal 会“体贴”地替你扩展成足够大的数据类型:
var a, b: smallint; c:longint;
a := 32768;
b := 32768;
c := a + b; //结果是 65536,在 C 语言中则肯定是 0
归根结蒂,C 贴近机器,骨子里把操作数当作“二进制”处理(这有时是优点,尤其是跟硬件打交道时);Pascal 贴近数学,尽量以数学的视角看待数值。
10. 至于 C 的 for 循环如何强大,Pascal 的 for 循环如何循规蹈矩,这些都不是太重要。
========================================================
我认为最大的区别在于c中的函数内部不允许定义其他函数
但是pascal的过程 函数中允许存在
另外赋值 c用=pascal用:=
还有就是c用{}表示作用域 但是pascal用begin end
关于for循环c可以随意给条件中的变量进行增加和减少如
int i;
for(i=0;i100;i+=2)
{
}
但是pascal中每次只能增加1(不知道这一点是不是正确,可能跟vb搞在一起了 你就参考一下吧)
=========================================================
从oop来说他们还有些区别。
1. pascal不支持多重继承,只能由单一的父亲,而c++允许多父亲。
如果大家用果BC提供的TV编程,那么一定看过TV的源代码,你会发现他和delphi的vcl多么类似,但是他毕竟是c++写的,采用了很多多重继承,delphi后来重新写了她。
从oop的未来发展来看,并不提倡多重继承,java类似pascal也不支持这样操作,这从根本上降低了类的复杂度和可读性。
2.pascal原来没有重载、多态这些该概念,现在的borland把pascal完善的已经脱胎换骨了。
3.pascal至今仍没有c++的友元。他所谓能做到的只是可以访问同一个unit的其他类的私有变量。现在的编程中,大家应该尽量避免使用友元了。
4.pascal的所有类都是TObject的子孙,实际你什么都不写
aaa= class();
end;
仍然等效与
aaa= class(TObject);
end;
这样所有的类指针都能用TObject来转换,而且他在TObject里面已经做到了一些基本的类的初始化、析构和操作符重载。这是c++的不及。
5. 所有的pascal 必须显式声明构造函数,即使你里面什么也不写。而c++可以没有。
6. pascal所有的类都是在堆中申请,统一管理,各个类的互相操作都在堆里面进行。
而c++却可以在堆、栈和数据区里面存在,这样各个不同区域的类相互访问,成了c++需要解决的一个复杂问题。
7. 基于上面的原因。
比如一个类 TDemo,
再C++ 里面可以写成
TDemo *demo= new TDemo();
TDemo demo; // 直接创建实体
但是在pascal里面就必须写成
Demo: TDemo;
Demo:= TDemo.Create();
8.还有个问题,就是字符串。
现在可以说pascal的字符串操作性比c++要强大。
他可以直接的+,而c++却不行,这得主要原因是c++太接近底层操作了。
9.还是字符串
pascal的字符串 分为长字符串和短字符串,他们的开始string[0],这个[0]里面实际保存的是字符串的长度,长字符串是4个字节,表示4G长度的字符串,短的1个字节,最多长度255,而不像c++是结为\0表示结束。
pascal这样的好处很多,比如你想得到一个字符串的长度,c++需要扫描整个字符串,直到遇到\0才能统计出来大小,而pascal直接读[0]就行了,这个效率你可以从编译后产生的汇编代码来看。
还有一个好处就是对于多字节字符串支持,比如unicode,由于是16bit的,里面会出现很多\0,这就与c++的字符窜的结束符号冲突,c++为了解决不得不变成\0\0来表示结束。而pascal却不用任何变化。
10......还有好多,我一时想不起来了
1、声明数组的语句:
Dim types( ) As integer
2、然后使用ReDim语句来配置数组大小。
ReDim Types(X+1)
3、假设想改变数组大小又不想丢失原来的数据,仅仅要在ReDim语句中包括Preservekeyword就能够,典型语句为:
ReDa_m PresetVe Types(10,23)
对于多维数组,在使用Preservekeyword时,仅仅能改动最后一维的大小。假设改变其它维,那么将出现执行错误。假设不清楚某维的当前大小,能够使用GetI~ength函数来获取。
扩展资料:
数组的使用:
用For Each来循环遍历一个数组。比如:
Dim x As Integer
F0r Each x In arrayl
Console.WriteLine(x)
Next
在使用数组时还要注意,不仅声明语法有变化,并且在执行时处理方式也有了非常大的变化。VB.NET在堆栈中给数组分配地址空间,当向一个方法传递数组类型的参数时,使用的是引用传递而不是值传递。以下是互相传递数组引用的三个方法:
Dim arrayl(3,3)AS Integer
Dim array2 As Integer(,)
Redim array2(3,3)
Dim array3 As Integer(,)={{2,4},{12,29}}
具体方法:
选择菜单命令工具(T) 指令向导叄?缓笱≡?NETR/NETW;
1 指定您需要的网络操作数目
2 指定端口号和子程序名称
3 指定网络操作
4 分配 V 存储区
5 生成代码
为了便于进行连接在网络中的 PLC 之间的数据交换,S7-200支持网络读(NETR)和网络写(NETW)指令。NETR 指令从远程 PLC中的指定地址读取配置好的一定数量的数据。NETW 指令向远程PLC中的指定地址写入配置好的一定数量的数据。NETR
和 NETW 指令操作由数据表中的前七个字节控制。表中的一个数值是读取/写入数据长度,可以规定 1 至 16 个字节。因此数据表最大可达 23 个字节。
注释:在使用 HSC 向导之前,程序必须被编译,且处于符号编址模式。如果您尚未编译程序,向导在 HSC 配置过程开始时会提示您编译程序。
向导将向您询问初始化选项,然后为指定配置生成程序代码和数据块代码。从第一个屏幕选择NETR/NETW后,向导向您询问下列信息:
步骤 1 指定您需要的网络操作数目
注释:如果项目包含使用 STEP 7 Micro/WIN 3.2 版建立的现有 NETR/ NETW 配置,您必须在继续执行步骤 1 之前选择编辑其中一个现有配置或建立一个新配置。
可使用 NETR/NETW 指令向导,简化网络操作配置。向导将向您询问初始化选项,并根据您的选择生成完整的配置。向导允许您配置多达 24 项独立的网络操作,并生成代码协调这些操作。
步骤 2 指定端口号和子程序名称
注释:项目可能已经包含一个 NETR/NETW 向导配置。所有以前建立的配置均被自动载入向导。向导会提示您完成以下两个步骤之一:
?选择编辑现有配置,方法是点击“下一步”。
?选择从项目中删除现有配置,方法是选择“删除”复选框,并点击“完成”。
如果不存在以前的配置,向导会询问以下信息:
1. PLC 必须被设为 PPI 主站模式才能进行通信。您要指定通信将通过哪一个 PLC 端口进行。
2. 向导建立一个用于执行具体网络操作的参数化子程序。向导还为子程序指定一个默认名称。您可以编辑默认名称。
步骤 3 指定网络操作
对于每项网络操作,您需要提供下列信息:
1. 指定操作是 NETR 还是 NETW。
2. 指定从远程 PLC(NETR)读取的数据字节数或向远程 PLC(NETW)写入的数据字节数。
3. 指定您希望用于通信的远程 PLC 网络地址。
4. 如果您在配置NETR,指定以下内容:
- 数据存储在本地 PLC 中的位置。有效操作数:VB、IB、QB、MB、LB。
- 从远程 PLC 读取数据的位置。有效操作数:VB、IB、QB、MB、LB。
5. 如果您在配置 NETW,指定以下内容:
- 数据存储在本地 PLC 中的位置。有效操作数:VB、IB、QB、MB、LB。
- 向远程 PLC 写入数据的位置。有效操作数:VB、IB、QB、MB、LB。
步骤 4 分配 V 存储区
对于您配置的每一项网络操作,要求有 12 个字节的 V 存储区。您指定可放置配置的 V 存储区起始地址。向导会自动为您建议一个地址,但您可以编辑该地址。请注意,如果您使用重叠地址,向导在显示一则警告后,允许您进入下一步。
注释: 在 NETR 操作中,请确认将用于存储数据的变量地址没有与分配给向导配置的存储区地址重叠。
步骤 5 生成程序代码
回答这些询问后,点击“完成”,S7-200 指令向导将为您指定的网络操作生成代码。由向导建立的子程序成为项目的一部分。要在程序中使能网络通信,需要在主程序块中调用执行子程序(NET_EXE)。每次扫描周期时,使用 SM0.0 调用该子程序。这样会启动配置网络操作执行。为每项网络操作建立的数据处理子程序会在适当时间被自动调用。
VB支持Module,是一种全部成员都是静态的特殊类型
C#支持static class,和VB的Module类似;
VB的Imports语句可以把类的静态成员导入,而C#的using语句没有这个功能
Imports System.Math
VB可以选择变量是否必须声明,以及类型是否必须指定(通过Option语句)
C#则默认是VB最严格的状态
C#可以使用extern alias指定程序集的别名,并使用别名限定运算符::来解析类名冲突的两个程序集
VB没有这个功能,但可以用Global关键字获得命名空间级别名称冲突解析能力
C#可以指定友元程序集,VB不支持
//成员层
VB可以直接重写Object.Finalize方法,而C#必须采用析构函数的语法
C#可以指定attribute的target以便清楚地放置attribute,而VB则通过尖括号的位置来决定,有时候写不出某种C#可行的语法
VB能够重载这些C#不支持的运算符:, ^, Like, \
C#能够重载这些VB不支持的运算符:++, --, !
VB中子类的构造函数,先调用父类的构造函数,然后才初始化子类的字段
C#中子类的构造函数,先初始化子类的字段,然后才调用父类的构造函数
VB的Implemnts语句可以为实现接口的方法改名,改变访问级别
C#不支持但是有一个显式实现的语法可以帮忙
VB的函数重载,子类和父类的方法视为同级
C#的函数重载,子类优先于父类
VB的Main函数自动加STAThread(),可以改
//继续成员层
C#的自定义event可以修改add和remove的规则
VB的自定义Event除了C#的之外,还支持重载RaiseEvent语句的用法
VB的Event可以直接书写Event参数,自动生成Delege类型
C#的event必须指定delegate类型
VB支持WithEvents/Handles静态事件绑定语法,也支持AddHandler动态绑定方法
C#的事件只支持使用+=动态绑定
VB的属性(Property)可以带参数
C#的属性不能带参数
尽管不支持手工定义,VB支持属性按引用传递值,C#不支持
VB可以指定一个带有参数的属性为Default,于是支持索引语法
C#则必须把这个东西声明为索引器,即this语法
VB允许方法带有若干可选参数(Optional)可指定默认值
C#不允许
C#支持out参数,传入前不需要初始化
VB不内置支持
C#支持类中使用fixed buffer,即固定大小的类似数组的成员
VB不支持
C#支持按照参数是否带有ref/out进行函数重载
VB不支持这种重载
C#允许仅大小写区分的两个函数或变量存在
VB不区分大小写,因此也不允许
(成员层一时想不起来了,呆会再想)
//函数层
VB支持局部Static变量
C#不支持
VB支持数组的最后一唯大小可变
C#的数组大小不能改变
VB的Try Catch语句支持Exit Try直接进入Finally
C#无类似语句
VB的Catch可以带When子句,使用.NET的异常filter功能有选择的进行捕获
C#完全不支持这一功能
VB可以使用传统的On Error方法,非结构化地处理异常
C#仅支持结构化
C#支持使用checked语句暂时打开或关闭整数溢出检查
VB仅支持整个项目级别处理
VB支持使用函数名作为返回变量,也支持Return
C#只支持Return
VB的Try, Using, For, For Each等语句支持使用前边定义的变量
C#的对应语句只能在语句开始处定义
C#可以支持unsafe语法有限地支持指针和stack数据的访问
VB不支持
C#支持yield return语法的迭代器生成
VB不支持
C#支持delegate语句就地生成支持closure的匿名方法
VB不支持
C#支持在委托与方法结合的过程中使用协变和反边规则
VB则只能使用完全匹配规则
VB和C#的循环和分支有若干次要差别
C#支持nullable类型的运算符跨类型支持
VB需要手工完成同样功能
VB支持用实例访问类的静态成员
C#只支持类明访问
VB支持按照非虚函数的规则,调用自身类型定义的一个虚函数
C#不支持这一功能
类库层
VB有一个非常好用Microsoft.VisualBasic.dll,实现了许多帮助函数,Application Framework应用程序框架,My命名空间等
C#只能望眼欲穿了……
C#以out/ref或者大小写区分不同函数,这就是不符合CLS的。
VB的每个特性几乎都是CLS兼容的(即使是那些C#不支持的),在VB中使用不会从根本上影响到与C#的交互
变体(Variant)型数据,是一种可变的数据类型,也是一种非常灵活的类型。它可以存储数字、字符串、数组、对象等各种数据。它能够表示所有系统定义类型的数据。变体型变量可以在程序执行期间存放不同类型的数据,VB会自动完成任何必要的转换。