返回首页

简介
本文的目的,是一次都证明,经验证据的手段,由VB和C#编译器生成的MSIL代码是不相等的,特别是在处理与非void的方法和字符串值比较。为了证明这一点,对比,将每两个相同的组件,在VB编码,另外一个可能的解释为什么存在差异,在C#的编译器产生的MSIL代码之间。之后,将简要地讨论了这种差异的意义随着打算最多的VB与C#语言战争耀斑一些偏颇意见。测试程序集
在测试中使用的两​​个组件在所有方面都是相同的。然而,在这里我只提供一个代码,只键入每个程序集公开,以及由此产生的MSIL代码,代表只有两种方法的相同类型的揭露。为了验证其他的因素是什么??是平等的为好,如优化设置,,感觉免费下载的代码。最后,这两个组件进行编码和使用VS.NET 2003的Windows XP SP2的机器上(NET 1.1 SP1)的编制。此外,MSIL代码是使用ILDASM.EXE(版本1.1.4322.573)获得。VB型ClassLibrary1.Class1:公共类class1 的Public Sub New() END SUB 由于整数的公共函数foo1(布尔BYVAL测试) DIM我作为整数 如果(测试),然后 I = 1  0; 其他 I = 2  60; 结束如果 回报我 端功能 公共小组foo2的(布尔BYVAL测试) & #160; DIM作为String的=没有 如果S = String.Empty然后 结束如果 END SUB末级C#类型ClassLibrary1.Class1:公共类class1{ 公共Class1的() { } 公众诠释foo1(BOOL测试) { 诠释我;  0; (测试) I = 1;& #160; 其他 我= 2; 返回我; } 公共无效foo2的(BOOL测试) { 字符串s = NULL; (S == string.Empty){}; &# 160; }
所以现在我们有两个相同的类型,在VB和C#编写的,后者的书面前。首先,让我们每一个编译器产生的成员foo1比较MSIL代码。VB的MSIL(foo1):公共实例。方法INT32 foo1(BOOL测试)CIL可网管{ / /代码大小11(0xb) maxstack 1 &# 160;当地人的init(INT32 V_0 INT32 V_1) IL_0000:ldarg.1 IL_0001:brfalse.s IL_0007 IL_0003:ldc.i4.1 IL_0004:stloc.1 IL_0005:br.s IL_0009  ; IL_0007:ldc.i4.2 IL_0008:stloc.1 IL_0009:ldloc.1 0; IL_000a:RET} / / Class1的方法结束:foo1C#中的MSIL(foo1):公共hidebysig实例方法INT32 foo1(BOOL测试)CIL可网管{ / /代码大小11(0xb) maxstack 1 当地人的init(INT32 V_0) IL_0000:ldarg.1 IL_0001:brfalse.s IL_0007 IL_0003:ldc.i4.1 IL_0004:stloc.0 IL_0005:br.s IL_0009 IL_0007:ldc.i4.2 IL_0008:stloc.0 IL_0009:ldloc.0   ;IL_000a:RET} / / Class1的方法结束:foo1
乍一看,两个编译器产生的MSIL代码看起来是相同的。首先,每个版本都有相同数量的MSIL代码行其他。其次,两个版本完全相同。maxstack指令,也就是说,每个方法需要使用其他相同数量的栈槽。但是,如果你看一下在第三行MSIL代码,当地人init指令,它是用来声明变量并分配初始值,一个显着差异之间存在着两种版本:
VB:当地人的init(INT32 V_0,INT32 V_1)
C#中:当地人的init(INT32 V_0)
为什么,尽管方法foo1使用一个,只有一个本地变量(i),VB MSIL代码声明并初始化一个额外的变量,变量V_0,这是从来没有使用过?另一方面,C#的MSIL代码声明并初始化之一,只有一个变量,这使得绝对意义上已经表示明显的原因。
现在的问题是,为什么差距,无论多么重大的或微不足道的,它可能是。 IM没有专家,特别是在处理与MSIL,但我几乎是100%肯定的,未使用的变量是只有因为,不像C#,VB允许一个功能的代码路径没有返回值,而当这种情况发生,未使用V_0变量成为使用。换句话说,在VB中,可以有一定的回报类型的功能,但如果你不显式地返回该类型的值,编译器将返回类型的默认值,因此,存在的神秘V_0变量。为了证明我的观点,让注释掉value.Public功能foo1 VB版本的foo1方法,明确返回功能(布尔BYVAL测试线)作为整数的最后一行 DIM我作为整数 如果(测试),然后 I = 1 其他  ; I = 2 结束如果  0; "回报我端功能
经过上述变化和编译,生成的MSIL代码看起来:公共实例方法INT32 foo1(BOOL测试)CIL管理{ / /代码大小11(0xb) maxstack 1 当地人的init(INT32 V_0 INT32 V_1) IL_0000:ldarg.1 IL_0001:brfalse.s IL_0007 IL_0003:ldc.i4.1 IL_0004:stloc.1 IL_0005:br.s IL_0009  60;IL_0007:ldc.i4.2 IL_0008:stloc.1 IL_0009:ldloc.0 &# 160;IL_000a:RET} / / Class1的方法结束:foo1
的VB foo1 MSIL代码的两个版本之间唯一的区别是在倒数第二行。第一个版本,它明确地返回一个值,压入堆栈变量V_1,通过ldloc.1,因为V_1代表可变的,我认为,这反过来又明确返回值。第二个版本,doesn't明确返回一个值,因此,在编译器的结果压入堆栈的变量V_0,它始终坚持的函数的返回类型的默认值,由教学ldloc手段。 0。
这样的故事在这里的道德是,对于任何非空白VB编写的方法,编译器会生成MSIL代码总是声明和一个额外的相同类型的局部变量初始化为包含它的功能,一个变量可能或可能无法使用,这取决于是否功能不明确返回值分别。这里是我个人的看法,虽然额外的变量是尊重其性能和内存消耗的影响微不足道,但VB编译器应该足够聪明,包括额外的变量,当且仅当,成员的代码路径没有返回值。如果确实如此,那么额外的变量的声明和初始化毫无疑问是毫无意义的。
现在,让我们继续前进,在MSIL代码看看VB和C#编译器生成的方法foo2的。VB的MSIL(foo2的):公共实例方法无效foo2的(BOOL测试)CIL管理{ / /代码大小18(0X12) maxstack 3 当地人的init(字符串V_0) IL_0000:ldnull IL_0001:stloc.0 IL_0002:ldloc.0 IL_0003:ldsfld字符串[0] System.String::空 IL_0008:ldc.i4.0 IL_0009:INT32调用[Microsoft.VisualBasic] Microsoft.VisualBasic。 & #160; CompilerServices.StringType::STRCMP(字符串, 字符串, BOOL) IL_000e:ldc.i4.0 IL_000f:bne.un.s IL_0011 IL_0011:RET} / / Class1的方法结束:foo2的C#的MSIL(foo2的):公共hidebysig实例方法无效foo2的(BOOL测试)CIL管理/ /代码大小15(0xF的) maxstack 2 当地人的init(字符串V_0) IL_0000:ldnull IL_0001:stloc.0 IL_0002:ldloc.0 IL_0003:ldsfld字符串[0] System.String::空 IL_0008:调用BOOL [0] System.String:op_Equality(字符串,   ; 字符串) IL_000d:流行 IL_000e:RET} / / Class1的方法结束:foo2的
好了,它只是快速浏览的方法foo2的生成MSIL代码的两个版本,确实存在差异明显,此外,明显的差异比更是与foo1的情况下。
首先,比较每个版本的代码大小的意见,其明确的,更多的MSIL代码是用VB版本比C#版本(/ /代码大小15(/ /代码大小18(0X12))( 0xF的))。
二,VB版本预计将使用三个栈槽(maxstack 3),而C#版本预计将只使用两个栈槽(maxstack 2)。
从那里开始,所有仍然相等,直到我们到达IL_0008行,两个版本在这一点大大偏离。
C#版本首先推入堆栈的布尔结果[0] System.String呼叫:op_Equality,这是函数的C#使用比较字符串值时使用==运算符。然后,它会立即删除(POP)从堆栈权给调用者返回之前执行这个相同的布尔值。虽然去年的流行似乎毫无意义,theres此事真的没有选择,因为一个方法评估堆叠必须保留控制权返回给调用者之前空,除非是要返回一个值,是与非void的方法。
另一方面,VB版本先压入堆栈值0(ldc.i4.0),随后将弹出堆栈调用的一个参数,以Microsoft.VisualBasic.CompilerServices.StringType :STRCMP,这是函数VB使用比较字符串值时使用=操作符,这是入栈的整数结果。一旦多数民众赞成,指令ldc.i4.0再次使用入栈值0,所以,它可能是随后相比StrComp的整数结果。然后,通过指令bne.un.s IL_0011,最后两个入栈值,即,STRCMP和ldc.i4.0调用的结果,弹出,比较,如果不平等的结果,执行转移到IL_0011的指令,这似乎是因为冗余指令IL_0011紧随无论与否的结果是不平等,但最有可能是为了从堆栈中弹出的仍然留在它的最后两个值。
所以再次,问题就变成,为什么差距,无论多么重大的或微不足道的可能。那么,在这种情况下,答案是简单明了。 VB是为了向后兼容的原因,被迫使用strcmp,而不是String:op_Equality,其结果更激烈的STRCMP认为一个空字符串和空字符串相等,这是不是有很大的不同,弦乐:op_Equality,此外,这是最有可能的主要原因,前者是后者,而不是使用。从纯性能的角度来看,弦乐:op_Equality到strcmp优越的性能提升虽然会显现出来,只有当一个字符串比较激烈是,也许是一个紧密的循环内作出的。此外,还有一个简单的解决方案,这将消除这一案件中的问题,最大的性能是必须的,而不是=运算符比较字符串值时,使用String.Equals或op_Equality。例如,改变了foo2的VB版本:公共子foo2的(布尔BYVAL测试) DIM作为String的=没有 如果String.op_Equality(S,String.Empty) 结束如果END SUB管理
在以下MSIL代码的结果:公共实例方法无效foo2的(BOOL测试)CIL{ / /代码大小16(0x10的) maxstack 2 当地人的init(字符串V_0) IL_0000:ldnull IL_0001:stloc.0 IL_0002:ldloc.0 IL_0003:ldsfld字符串[0] System.String::空  0;IL_0008:调用BOOL [0] System.String:op_Equality(字符串, 字符串) IL_000d:brfalse.s IL_000f IL_000f:RET} / / Class1的方法结束:foo2的
请注意,现在的MSIL代码的两个版本是相同的,除了第二个到最后一个指令,。 C#版本只是弹出的协议栈的最后值保持它,通过POP指令,而在VB的版本弹出关闭堆栈上的最后一个值,零比较,和如果平等的存在,将控制权转移指令IL_000f,所有,在这种情况下似乎是多余的,因为原来的语句块,如果是空的,因此编译器应该足够聪明,忽略它虽然另一方面,通过brfalse.s L_000f指令,编译器也足够聪明要知道,在大多数,如果不是所有的情况下,如果语句块不会是空的,因此,大概的数字,为什么甚至懒得尝试检测一个。测试结果的意义
你可能有在读这篇文章,我是想证明一个观点一个C#程序员后得出的结论。好了,你说对了一半。我一定努力证明一个点,点是,与VB语言,您如何使用的语言,与遗留代码的向后兼容性,和逻辑假设的内在本质的原因,在无为而治的结果VB编译器生成的代码几乎是C#编译器的效率,但不作为一个高效的C#编译器生成代码。
(注:偏见的陈述,旨在促进VB与C#语言的战争即将开始,所以你可能要停止阅读。)
在说,让我说得很清楚,我做我在VB中的当务之急编码,自从我有我在MIS中获得学士学位后,我的第一份工作。一个优秀的语言,因为第4版,在更大程度上,与第7版(NET)起,不限制到一个单一的编程范式的方式C#不的程序员。关于MSIL代码的差异,本文的重点,在地球上真的除了鄙视(CG)的VB程序员关心的意义?当然,乡亲,支付给我们的代码可以不在乎所有本文中发了言,我向你保证,如果我是试卖的情况下,C#是更好吗??比VB基于什么在这一个CIO / CTO,知道他的。NET的文章,我可能会被解雇我缺乏完整的商业判断。此外,吉姆,财务副总裁,MSIL代码多数民众赞成在这篇文章中包括和尝试,使他的部门VB应用程序都应该在C#中重建的情况下,我保证你会笑本赛季的股票,虽然一些C#乡亲在这里,一个特殊的,勇于尝试这样的东西。
真的,一个和唯一的原因IVE写这篇文章只是抛出的VB与C#战争的火焰汽油。 IM生病和厌倦听到所有的所有的言辞。NET语言中都是平等的,,因为这是情况并非如此,毫无疑问优于C#中的VB。此外,我也怜悯所有可怜的前提下,是如此轻易否定的,是用来支持奇谈怪论,C#是"更好"比VB。喜欢它太罗嗦的事情吗??或太牛了VB代码存在??只是不削减它。如果你开始在CP或任何一个C#与VB的辩论,请务必给我的链接,这样我可以参加。
,请不要把我所有的垃圾谈话严重。我尊重你们。这只是我零的C#语言。这只是另一种RAD工具,仅此而已,无所不及,有幸利用关闭的经验,好的和坏的,其他各种语言,包括VB,和,此外,不必担心现有的遗留代码。我的态度很可能会改变MS Office是完全用C#编写的一天。最后的思考
最后,我相当有信心,我作出的MSIL代码生成的C#和VB编译器之间的比较结论,大部分是真实的。但是,正如我已经提到,我不是专家,但如果你是知道的东西,我不能够探测到我的错误,请让我知道。

回答

评论会员:JCKodel 时间:2011/12/03
,这是不公平的任何语言​​之间的比较,如果你不知道你在做什么

从这篇文章中的一个例子:为什么VB中生成的代码有2个变量在MSIL如果我们只是声明了一个
因为这是不正确的:

看到这一点:

公共功能测试()为整数
测试= 1
结束函数

所以,如果你编译为MSIL,你会看到,只有1个变量声明(这是函数本身)。

因此:

公共功能测试()为整数
昏暗的结果作为整数= 1
返回结果
结束函数

这是"VB以外的任何其他"节目,所以,如果你知道该怎么做,你会得到相同的结果。

有很多VB的,只是被忽略,因为他们不知道他们在谈论什么... ...例如:整数返回产量和静态X有异曲同工之妙,但在不同的时尚

现在,VB 10,在VB的问题将是固定的,作为两种语言将汇聚越来越多的
评论会员:。佛罗伦萨 时间:2011/12/03
我喜欢彗星#很多,但我是Visual Basic新的程序员非常有帮助。它有一个非常简单的sintaxis,使学生完美。


评论会员:reinux 时间:2011/12/03
这是只能由VB开发抛出了问题。这是因为许多人不是专业开发人员?点,其中一个企业没有照顾我的客户失去了150万美元的合同,由于性能之一。我孤立的问题,并告诉VB.NET开发什么样的变化做。他拒绝相信这些变化会造成任何影响,并拒绝重写他的代码。 {S0}管理终于告诉我重写它和它在C#。结果如何?我提高了15倍的吞吐量(与他在释放和我在调试的代码),和我们保存了客户的合同。
评论会员:vinay_chaudhari 时间:2011/12/03
在我的一个客户做分析,我发现,大多不是因为语言懒惰的程序员很多VB代码写得不好... ...。但是我发现一个程序写得非常好。我跑了IL代码分析,发现一节,做了一个集合LateBind呼叫类型我不记得。我看了看代码突出的部分... ...,这一切似乎是有效的。我终于做一吨的搜索和行比较,找出问题。

收集是建立在一个方法的开始。
后来我相信她如果语句,以确定如何加载集合
最后,她有一个for语句负载。

这是什么了,真的写得很好的代码,并与真正的低效代码结束。这是使用VS 2003构建的,它可能已被固定的现在和当时....但是你的分析是做得很好,并摧毁的神话,说:"这一切结束了相同的IL代码"
。 | Misty_Blue
评论会员:游客 时间:2011/12/03
我很好奇,你是否明确设置的建设模式,以发行,以确保最佳的MSIL代码生成?imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_2.gif"/我没有检查了自己出去,但我怀疑,像VB编译器产生的额外的局部变量的冗余信息在发布版本中精选出来的。我已经看到,在一份新闻稿中csc.exe的生产聪明MSIL代码生成比在调试版本中,这是不是很奇怪,释放基本上是允许优化。imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_3.gif
吉安卡洛 - 阿奎莱拉
评论会员:游客 时间:2011/12/03
。显然,这是一个古老的线程,但我想情趣备份好吧,有点背景。我的第一个"真正的"工作作为VB编码了一年多我一点也。我现在一个专门的C#开发人员和我爱的语言。到目前为止,我喜欢C#中的VB。这并不意味着讨厌VB,太多*眼色,但我发现C#的主要是一个更好的语言。我看到了一些可怕的书面申请,在过去的几年里,其中最严重的在VB6。由VB6程序员编写VB7一些写得不好的应用程序。我不会天真地认为,这是VB的过错。这是很明显,由于糟糕的编码由程序员设计。然而,纯自然的VB的RAD采取方便的口头禅,因此,导致更懒惰的编程实践。VB中需要更多行的代码,很奇怪(因为它是RAD的打算),语法编写代码较为繁琐。几千行代码的C#编码可以得到更快(至少在我们的代码片段。NET2.0...VB可能有头发快1.1我要强调的可能)。传闻约是我们的编码器之一。他是一个CAD及参数化造型设计师,谁是我们通过在IT的儿子。我们教给他的方案(由以前的高级开发人员在VB),因为我已经转换到C#。他热爱并发誓这是更快的代码,因为它需要较少的线。是的,C#是稍微更有效率和头发更快。我觉得最大的优势是在语法和语言哲学执法。区分大小写是一件好事。也许我的偏见来自学习,在C代码,但它强制执行更好的编程实践。C#还你一个更灵活的开发,因为它是更容易识别与其他语言的编码...阅读别人的代码,并切换到其他的开发平台创建一个认知失调。最大的原因人折扣VB写的设计不良的应用量。我觉得,这是由于这样的事实,VB是一个更容易的切入点,开始比其他的"铁杆"语言的程序员,因此自然会产生更差的结果编写的代码比一个贫穷的语言的结果,更使。同样的道理,只是因为人们VB写的杀手级应用并不意味着他们能够做到这语言。他们是很好的开发。当然,他们发现在VB中的快捷键和漂亮的花样,也许VB中唯一的,即一切的嗡嗡声。,但他们是优秀的开发人员,会做任何他们已经成为发展中国家英寸高效的语言相同就个人而言,我觉得执行编程范式在C#更好的编程习惯和较少的代码行。你学会更好的代码像C#语言,一般来说(是总是有例外)。只是我的2美分。
Misty_Blue
评论会员:游客 时间:2011/12/03
有一个大的烂摊子{A}]检查出来,我很好奇,这导致。编辑:试想想它,我看到这吉安卡洛的文章,前一阵子了。还没有认为这是一个"更好"语言虽然
。吉安卡洛 - 阿奎莱拉
评论会员:游客 时间:2011/12/03
在第一个例子,一个额外的地方是VB.NET功能产生。我认为这是有因为备用的返回值的语法(VB遗留)即而不是使用返回LT;expressiongt;,可以使用LT功能namegt;=LT;expressiongt;作为替代语法。然而,与return语句退出功能,备用语句只是将其占位符的返回值。这个值将被作为返回值,每当有没有explicite返回路径(使用return语句)NBSP拿起;现在,尽可能语言比较,我认为其主观的判断。至于我而言,我一个VB家伙和国际海事组织彗星#吸仅仅是因为区分大小写。老实说,我没有看到任何理由,任何现代化的语言应该是敏感的,除非案件遗留原因(这究竟是C#的情况下-的情况下sensetive不是因为它是一件好事(而不是一件坏事,人的心灵真正关心情况下而命名实体是山姆分化从SAM),但因为它使简单迁移从Java,C,C
?Misty_Blue
评论会员:游客 时间:2011/12/03
很少有更多的事情......1)在VB.NEt,开发,以确保设置OptionExplicit和Option严格WHI权证#情况下灵敏反正你不能使用一个变量之前声明和初始化。2)VB.NEtsuxzCase语句!在C#中,开发商已经TP使用"突破"这是一件好事。"转到","跳","GOTO的情况下"其他有效的选项。3)在VB.Netu've中使用换行接续字元_这实在是烦人,在C,#,无需使用任何。4)VB.NET阵列是后裔。NET运行时的定义,在创建一个固定大小的System.Array。使用ReDim保留语句创建一个新的数组-旧数组的元素复制到新的一个。由于这发生在VB.NET,它成为性能杀手。5)C#使用PInvokewhich允许您调用函数和数据类型的封送处理正确,这是比VB.NEt的"申报"调用WindowsAPI。6)C#。NET允许你写非托管代码。7)在C#中,你可以声明为"动荡"的对象,因此它可以被修改是异步的。8)VB.Net很多隐式转换可以是明确的(感谢上帝!),而C#需要转换9)为一类,行为的C#不检查arithmatic溢出的校验和或哈希计算时是reaaly有用的,然后它提供了"检查"和"未选中"关键字。MYFAV一10)C#。NET是ECMA标准化,并相信它或没有,这是一个巨大的差异consider.VB.Net仍是不规范的(可能永远不会被imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_4.gif的),所以它缺乏跨平台的供应商的支持可能性像C语言,C#,SQL92的提供。因此,C#比VB.Net更好的选择Hmmmmmmm,我认为有一点是现在不够好。{五}欢呼声,尼尔imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_6.gif
戴夫巴切尔
评论会员:游客 时间:2011/12/03
Misty_Blue写道:VB.NEt,开发商,以确保设置OptionExplicit和Option严格WHI;权证#情况下灵敏反正你不能使用一个var声明和初始化之前"首先,我觉得非常神奇,一个单一的语言可以用来作为一种松散类型的强类型语言,,它可以在文件级别上控制。Furthemore,我也相信它的强大,一个单一的语言给你的能力申报或不申报你的变量在使用前,它可以在文件级别上控制。更多的权力来开发。然而,我自己有没有使用这些功能时,我有大量互动与COM,在这种情况下后期绑定有时是有益的,,不等于别人不为他们的需要。选项​​有程序员来决定何时以及如何使用它们,如果有的话,和我的强大{五}。最后,我没有看到什么情况下,灵敏度要么功能Misty_Blue写道:"2)VB.NEtsuxzCase语句在C#中,开发人员TP使用!"突破";其他有效选项",这是一件好事,也是"转到","跳","转到情况下{BR}你在开玩笑吧?VB的SelectCase语句是比C#的开关强大得多!您可以指定一个值的列表,一个值的范围,甚至同时,或可以测试使用关系运算符,等等..在C#中你怎么做:案例1至4,7至9,11,13,MAXNUMBER好了,你不能!在最令你可以这样做:案例9:案例11:案例13:或者你有"转到"另一个case标签块。吸!在复杂的关系操作结束,您必须使用if语句,虽然没有错,但说C#的开关是更强大的是完全错误的。我觉得这很酷,你可以跳跃到另一个从一个case块,但我认为它吮吸,你必须明确地打破一个。我知道有没有这样的事情作为fallthrough,在C的,但不能没有迫使一个明确的突破imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_8.gif?Misty_Blue写道:"在VB.Netu've3)使用换行接续字元_这实在是烦人,在C,#,无需使用任何东西。"哦,请{五}!首先,行继续实现只是底线,而不是连字号。第二,我宁愿有几次使用续行符,代码行是太长了单行,而不是在每一个单一的代码行我写的{五}键入一个分号。Misty_Blue写道:"4)VB.NET阵列是NET运行库的定义,在创建一个固定大小的System.Array的后裔中,ReDim保留语句创建一个新的数组-。旧数组的元素复制到新的,因为这发生在VB.NET,它成为性能杀手。"首先所有C#的数组的System.Array派生,所以他们在与VB的相同。二,使用ReDim保留只是一个VB调用Array.CopyTo,这是你​​会做什么,如果你想增加一个数组的大小,还保持在其当前值,最终你还是要创造一个又一个的具体方式。无论你怎么做的,是的,我知道它是一个性能杀手。Misty_Blue写道:"5)C#使用PInvokewhich允许您调用函数和数据类型正确封送处理是远远高于VB.NEt的"声明"调用WindowsAPI。"那么VB的!{五}确保你有选择使用声明,除了DLLImport,但在结束所有Declare语句被替换DLLImport。再次,它的所有有关选项imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_8.gif。Misty_Blue写道:"6)C#。NET允许你写非托管代码。"这样:-此外,我已经告诉你,C#的指针是一个可怜的借口,和,如果一些奇怪的原因,你需要使用指针,那么你应该在C编码。我还告诉你给我做C#中指针的东西,我不能在VB中使用System.Runtime.InteropServices.Marshal类的一个具体的例子。Misty_Blue写道:"7在C),你可以声明一个对象,"挥发性",所以它可以被修改异步。"我能说什么,比我会尽我的锁定明确。Misty_Blue写道:"8)VB.Net允许而C#需要很多隐式转换,转换要明确(感谢上帝!!)"{BR}毫无疑问,但它也可以funtionEXPLICIT模式以及(选项宝宝{五}严格)的所有有关选项!Misty_Blue写道:"9)当为一类,行为的C#不检查arithmatic溢出的校验和或哈希计算是reaaly有用的,然后它提供了"检查"和"未选中"关键词"。VB也允许您禁用溢出。不,我们不检查,不加制止,但我不在乎imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_14.gif。Misty_Blue写道:"10)C#。NET是ECMA标准化,并相信它或没有,这是一个巨大的差异consider.VB.Net仍是不规范的(可能永远不会被叹了口气,因此它缺乏跨平台的供应商的支持可能性,像C,C#语言,SQL92的提供,因此,C#是一个更好的选择超过VB.Net"诚然,也许它的不规范,但它使得它的重量毡。听过的二氢?你仍然站立imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_14.gif采取护理家伙!
吉安卡洛 - 阿奎莱拉
评论会员:游客 时间:2011/12/03
当然我仍然站立!!ř雅kiddin我吗??{五}这一切都熬煮"意见"正如我预测。我的意思是u'r说THT,这是太有趣了"一个单一的语言可以作为一种松散类型的强类型语言使用!"!imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_14.gif这就像VB.Net让你做世界上所有的错误。但是,如果youw蚂蚁,你可以停止做那些错误。这是极其愚蠢的!loolz你回答所有这些事情都以同样的方式。最终我只是希望人们会得到我的观点,它是假的,说一种语言比其他更好的,当我们谈论关于C#和VB.Net,我想,不像有些人垃圾VB.NEt,你应该停止捣毁的C#。NET"CUZ真的毫无意义。不管怎么说,好运气=imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_3.gif尼尔。
达格哈马舍尔Oystein约翰森
评论会员:游客 时间:2011/12/03
对不起的人,但非常微弱计数器,花花公子来,你可以做的更好,毕竟你开始和所有其他线程{五}。我没有拖入他们的人。Misty_Blue:"我希望,不像有些人垃圾VB.NEt的人,你应该停止捣毁C#中网"CUZ它真的毫无意义的"伙计,我不明白你为什么要标记上"网"的C#。我受不了,VB.NET不只是简单地称为VB7imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_14.gif的事实。好吧,我放弃了,你赢了!您可能仍然站立,但你已经厌倦了地狱,我imgsrc=http://www.orcode.com/upimg/2011_12_03_22_16_03_21.gif欢呼声, 最终虽然ENDSUB )他问一个问题是一个五分钟的傻瓜。他不问一个问题仍然是一个傻瓜永远。[Chineese谚语]关于Senthil