﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-张志松-随笔分类-VB.NET</title><link>http://www.cppblog.com/Zezese/category/15869.html</link><description>记录工作点滴，留下人生轨迹。(zezese@163.com)</description><language>zh-cn</language><lastBuildDate>Thu, 10 Mar 2011 14:13:13 GMT</lastBuildDate><pubDate>Thu, 10 Mar 2011 14:13:13 GMT</pubDate><ttl>60</ttl><item><title>转(MSDN) VB.NET的强大和C#语言的比较</title><link>http://www.cppblog.com/Zezese/archive/2011/03/09/141416.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Wed, 09 Mar 2011 05:47:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/03/09/141416.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/141416.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/03/09/141416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/141416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/141416.html</trackback:ping><description><![CDATA[<p>在网上经常能看到&nbsp;&nbsp;&nbsp; 一些评论和比较C#、VB.net优劣的文章。其中绝大多数都认为：VB.net就没有它存在的必要，VB.net迟早要被C#取代。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 确实，计算机语言不是很重要的，也许讨论它有点无聊。所以还希望那些&#8220;心中无剑&#8221;、&#8220;架构、思想至尚&#8221;的高手们口下留情。<br>关于VB.net与C#在功能、能力、面向对象的特性上，实在是难分伯仲。这个已是不争的事实。尤其是VS.net2005中，这两种语言已经达到了惊人地相似！</p>
<p>下面就通过三个大方面对这这两种语言进行比较：<br>一、语言的人性化区别<br>C#像傻男人，VB.net像聪明贤惠的女人<br>从代码的风格就可以看出。</p>
<p>例1.&nbsp;&nbsp;&nbsp; 声明变量时：<br>C#: int&nbsp;&nbsp;&nbsp; iTest&nbsp;&nbsp;&nbsp; ; //很直接的语气,类似于:擦汗！拿毛巾<br>VB.net Dim&nbsp;&nbsp;&nbsp; iTest&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; Integer &#8216;很委婉的语气,类似于:小王,给我拿条毛巾,我用它擦汗~<br>实现完全相同的功能，但有着很明显的区别。哪个更人性化、更易懂呢？</p>
<p>例2.语言的关键字上：<br>C#关键字：<br>using、this、void、base、abstract、sealed、virtual、switch、internal、static<br>相应的VB.net关键字：<br>Imports、Me、Sub、MyBase、MustInherit、NotOverridable、MustOverride、Select&nbsp;&nbsp;&nbsp; 、Friend、Shared</p>
<p>比较一下，C#的关键字比较冰冷，是具有一定&#8220;机器味道&#8221;的语言。<br>而VB.net的关键字，都是&#8220;人的行为&#8221;，&#8220;人的称谓&#8221;。<br>相信VB.net的语法更具亲和力，更易于帮助我们理解面向对象的特性。</p>
<p>二、语言的先进性的对比<br>现在，计算机软件工程越来越庞大，已经远远不是10年前的几十KB大小的级别了。这就对语言的可扩展性、可辅助性提出了更高的要求。&#8220;面向对象&#8221;便是这个需求的一个产物。</p>
<p>从现有的语言来看，具有&#8220;标识符&#8221;的标识性语言具备更高的容错性、可调试性、可扩展性。比如HTML、XML。尤其是XML已经成为了下一代语言的模型。<br>为什么像HTML、XML这种具有&#8220;开口&#8221;和&#8220;封口&#8221;的语言&nbsp;&nbsp;&nbsp; 有更高的容错性、可调试性呢？这要取决于它的&#8220;吝啬&#8221;性。&#8220;开口&#8221;和&#8220;封口&#8221;可以把故障的范围最小化，使出现问题的部分尽量不影响其它部分。比如说：在HTML的&lt;table&gt;中，少写一个&lt;TR&gt;多写一个&lt;TR&gt;均不会对表格中其它行造成太大的影响。 </p>
<p>与&nbsp;&nbsp;&nbsp; 这种&#8220;吝啬&#8221;的语法相反的是&#8220;贪婪&#8221;性的语法。什么是&#8220;贪婪&#8221;性呢？这个问题也不太好解释。不过，这种特性与正则表达式的解析十分十分地一致。&#8220;吝啬性&#8221;的正则表达式&nbsp;&nbsp;&nbsp; 用做 精确匹配Group时有着较高的性能，而&#8220;贪婪性&#8221;的正则表达式用于判断IsMatch时有着较高的性能。<br>像C类的所有封口均使用大括号的语言，就属于这种&#8220;贪婪性&#8221;性的语言。过多相同的封口使得代码更加地难于控制。</p>
<p>许多人抱怨微软，为什么不给C#加上动态编译、加上自动完成&#8230;&#8230;，实际上，微软何尝不想加啊，但由于C#的语法特性，是根本无法实现的。下面就用实例来说明为什么C#无法实现动态编译：</p>
<p>看下面的C#代码段，代码中的大括号是不平衡的：<br>class&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;&nbsp;&nbsp; C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; F1()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;&nbsp; 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; F2()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;&nbsp; 2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>假如现在已经有了C#的动态编译器，现在要求编译器指明到底是哪里丢失了大括号！<br>这时，编译器就糊涂了：因为&nbsp;&nbsp;&nbsp; 不论是把大括号加在F1的末尾&nbsp;&nbsp;&nbsp; 还是加在class&nbsp;&nbsp;&nbsp; A的末尾&nbsp;&nbsp;&nbsp; 都是行得通的，虽然这两种情况的意义是完全不同的，即：不能判断F1到底是Class&nbsp;&nbsp;&nbsp; C的方法，还是Class&nbsp;&nbsp;&nbsp; B的方法。那么连带下一步，在代码的其它部分&nbsp;&nbsp;&nbsp; 就更无法判断&nbsp;&nbsp;&nbsp; 调用F1的代码的合理性了。</p>
<p>这里只是举了一个简单的例子，实际的情况比这个更复杂。我们可以看到，在C语言的代码没有完全正确地书写之前，它的结构是有可能极度混乱、多意性的，在这种极度混乱的环境下&nbsp;&nbsp;&nbsp; 是无法判断故障之所在、无法正确识别对象的结构的。自然，这样的动态编译器也就成了&#8220;累赘&#8221;。</p>
<p>相比之下，同样的内容&nbsp;&nbsp;&nbsp; 看看VB语法：<br>Class&nbsp;&nbsp;&nbsp; A<br>Class&nbsp;&nbsp;&nbsp; B<br>Class&nbsp;&nbsp;&nbsp; C<br>Function&nbsp;&nbsp;&nbsp; X1()&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; Integer<br>Return&nbsp;&nbsp;&nbsp; 1<br>End&nbsp;&nbsp;&nbsp; Function<br>End&nbsp;&nbsp;&nbsp; Class</p>
<p>Function&nbsp;&nbsp;&nbsp; X2()&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; Integer<br>Return&nbsp;&nbsp;&nbsp; 2</p>
<p>End&nbsp;&nbsp;&nbsp; Function<br>End&nbsp;&nbsp;&nbsp; Class<br>End&nbsp;&nbsp;&nbsp; Class<br>无论你删除End&nbsp;&nbsp;&nbsp; Class还是删除End&nbsp;&nbsp;&nbsp; function，故障范围都不会扩大，定位就可以做到精准。</p>
<p>检错如此，自动完成代码也是如此。在C#环境下，由于代码结构可能存在着&#8220;多意性&#8221;，所以IDE有可能无法决定做处理的确切位置。</p>
<p>当然，C类的代码并不是没有优点，其优点主要有二：<br>1.节省代码所占的磁盘和内存空间<br>2.使编译器的体积能够做得更小（最终还是为了节省磁盘空间）<br>只有在&nbsp;&nbsp;&nbsp; 内存和磁盘空间非常珍贵的过去的年代里，C类语言代码才能够更具优势。<br>然而在内存和磁盘如此丰富的今天，这种优势已经成了劣势。</p>
<p>借助于这种具有确定的&#8220;开口&#8221;与&#8220;封口&#8221;的特性，相信VB.net会走得更远。<br>三、语言的灵活性、适应性的对比<br>C#的代码，可以&#8220;随便书写&#8221;：在一行里可以写多条语句，一条语句可以分成多行来写。这使得它的代码有可能更加地&#8220;松散&#8221;。虽然C#允许您把代码写得非常地松散，不过在实际的使用中，几乎所有的使用者都默默地走向了VB的代码风格（一行一条语句）。最后，它的分号成了累赘。</p>
<p>虽然C#的代码更加地自由，不过C#的思想比起VB.net起来却是更加地死板。<br>在这方面，我觉得把C#比做手动档汽车、把VB.net比做自动档汽车是比较合适的。自动档汽车也可以用手动档的方式驾驶。<br>C#的思想、思路在VB.net中均可实现，而VB.net的思想（自动档）却经常无法在C#上实现。下面举例说明：</p>
<p>例一：事件模型<br>在C#中，事件模型是固定的，构造一个事件模型通常需要下面的思路：<br>建立事件代理结构、声明事件、建立事件处理方法、添加事件句柄、判断事件代理是否挂到上实例、通过代理方法引发事件。<br>在VB.net中，即可以按照C#所用的模式建立事件，也可以用VB.net自身所带的RaiseEvent方法实现。虽然他们编译后的结构几乎是一样的，但毕竟VB.net让我们有了更多的选择，何乐而不为呢？下面就看看VB.net引发事件的两种方法示例：&nbsp;&nbsp; <br>方法一：用RaiseEvent.<br>这是一种非常快捷、代码思路非常清晰的一种方法：<br>Class&nbsp;&nbsp;&nbsp; EventClass<br>Public&nbsp;&nbsp;&nbsp; Event&nbsp;&nbsp;&nbsp; E1(sender&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; Object,e&nbsp;&nbsp;&nbsp; as&nbsp;&nbsp;&nbsp; XXXEventHandler)<br>Sub&nbsp;&nbsp;&nbsp; XXXX()<br>RaiseEvent&nbsp;&nbsp;&nbsp; E1(Me,new&nbsp;&nbsp;&nbsp; XXXEventHandler(&#8230;)<br>End&nbsp;&nbsp;&nbsp; Sub<br>End&nbsp;&nbsp;&nbsp; Class<br>方法二：用C#的的思路<br>Public&nbsp;&nbsp;&nbsp; Delegate&nbsp;&nbsp;&nbsp; Sub&nbsp;&nbsp;&nbsp; xxxHandler(ByVal&nbsp;&nbsp;&nbsp; sender&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; Object,&nbsp;&nbsp;&nbsp; ByVal&nbsp;&nbsp;&nbsp; e&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; EventArgs)</p>
<p>Public&nbsp;&nbsp;&nbsp; Class&nbsp;&nbsp;&nbsp; A<br>Public&nbsp;&nbsp;&nbsp; Event&nbsp;&nbsp;&nbsp; XXX&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; xxxHandler<br>Public&nbsp;&nbsp;&nbsp; Overridable&nbsp;&nbsp;&nbsp; Sub&nbsp;&nbsp;&nbsp; OnXXXEvent(ByVal&nbsp;&nbsp;&nbsp; sender&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; Object,&nbsp;&nbsp;&nbsp; ByVal&nbsp;&nbsp;&nbsp; e&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; EventArgs)<br>If&nbsp;&nbsp;&nbsp; XXXEvent&nbsp;&nbsp;&nbsp; IsNot&nbsp;&nbsp;&nbsp; Nothing&nbsp;&nbsp;&nbsp; Then<br>XXXEvent.Invoke(sender,&nbsp;&nbsp;&nbsp; e)<br>End&nbsp;&nbsp;&nbsp; If<br>End&nbsp;&nbsp;&nbsp; Sub<br>Sub&nbsp;&nbsp;&nbsp; X()<br>OnXXXEvent(Me,&nbsp;&nbsp;&nbsp; New&nbsp;&nbsp;&nbsp; EventArgs)<br>End&nbsp;&nbsp;&nbsp; Sub<br>End&nbsp;&nbsp;&nbsp; Class<br>&#8220;用尽量少的代码&nbsp;&nbsp;&nbsp; 做出更多的事情&#8221;是每个人程序员的最爱！<br>很显然，VB.net在这方面占尽了优势。</p>
<p>例二：可选参数结构<br>如下代码展示了VB特有的结构：可选参数<br>Public&nbsp;&nbsp;&nbsp; Sub&nbsp;&nbsp;&nbsp; XXX(P1&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; Integer,Optional&nbsp;&nbsp;&nbsp; P2&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; String,Optional&nbsp;&nbsp;&nbsp; P3&nbsp;&nbsp;&nbsp; As&nbsp;&nbsp;&nbsp; String)<br>&#8216;&#8230;<br>End&nbsp;&nbsp;&nbsp; Sub<br>这样的结构在C#中是无法实现的，但可以通过&#8220;重载&#8221;的方式实现相同的效果：<br>void&nbsp;&nbsp;&nbsp; XXX(int&nbsp;&nbsp;&nbsp; P1){}<br>void&nbsp;&nbsp;&nbsp; XXX(int&nbsp;&nbsp;&nbsp; P1,string&nbsp;&nbsp;&nbsp; P2){}<br>void&nbsp;&nbsp;&nbsp; XXX(int&nbsp;&nbsp;&nbsp; P1,string&nbsp;&nbsp;&nbsp; P2,string&nbsp;&nbsp;&nbsp; P3{}<br>当然，用VB.net也可以用重载方式写出一模一样的结构。</p>
<p>例三：事件代理的挂接<br>C#中：只有一种方法：XXX.XXX&nbsp;&nbsp;&nbsp; +=&nbsp;&nbsp;&nbsp; new&nbsp;&nbsp;&nbsp; XXX(&#8230;);<br>VB.net中：即可以效仿C#的方法：AddHandler(XXX.xxx,AddressOf&nbsp;&nbsp;&nbsp; XXX)<br>也可以把过程显示地指定给某个事件：Sub(&#8230;)&nbsp;&nbsp;&nbsp; Handles&nbsp;&nbsp;&nbsp; XXX.XXX</p>
<p>利用上面的第二种方法的特性，可以实现在VB.net代码编辑页中&nbsp;&nbsp;&nbsp; 简单地通过下拉框&nbsp;&nbsp;&nbsp; 来精确地定位某个对象的特定事件的处理过程。<br>遗憾的是，这种方便的特性在C#中是无法实现的。因为C#的语法:XXX.XXX&nbsp;&nbsp;&nbsp; +=的后面可以是任何方法返回的具有相同签名的实例。比如&nbsp;&nbsp;&nbsp; 通过属性、方法，甚至是随机判断后返回的。<br>这种&#8220;过份的自由&#8221;使得C#编译器在运行代码前不能准确地确定该对象事件的处理部位。</p>
<p>类似的例子太多了，举不胜举。</p>
<p>总之，VB.net给了我们更大的活动空间，它允许我们在&#8220;更快的速度&#8221;和&#8220;更严格性能要求&#8221;之间自由选择。</p>
<p>四、代码书写上的比较<br>一、变量的命名的区别<br>C#是区分变量的大小写的，这一点着实让人摸不着门。也许这仅仅是为了效仿Java?<br>在公共语言规范中(CLS)，明确规定&#8220;变量不区分大小写&#8221;的，真是难为了C#编译器，还要把&#8220;重名&#8221;的变量重新命名。<br>相比之下，VB.net更加符合CLS，而且因为不区分大小写，编辑器就更轻松地实现了&#8220;自动更正&#8221;功能。<br>C#绝对是&#8220;嫁错了人&#8221;。<br>C要区分大小写，其原因有二：一是为了能使用更多的变量资源，二是为了节省编译器的开销（性能和体积上都节省）。<br>如今，.net环境允许我们使用多达1024个长度的变量名，而且已完全面向对象化，相同的变量可以同时出现在任何object中，所以可用的变量资源数量&nbsp;&nbsp;&nbsp; 理论上已经达到了无穷多个！<br>在这样的条件下，&#8220;区分大小写&#8221;使代码在&nbsp;&nbsp;&nbsp; 可读性、可调试性、可辅助性上都造成了不小的负面影响！它已经成为了语言发展的障碍！</p>
<p>二、代码的书写<br>几乎绝大多数的C#程序员都觉得他们在代码的书写上有着无与伦比的优越性，因为C#代码看上去是如此的简洁。<br>是的，如果我们仅使用记事本来开发.net应用程序，我相信像VB、Delphi早就灭绝了。<br>但更糟糕的是：如果我们仅能使用记事本写代码，那么程序员也早就集体自杀了。<br>说多少也不会有人相信，尤其是C#程序员不会相信&nbsp;&nbsp;&nbsp; 在代码书写方面&nbsp;&nbsp;&nbsp; 他们会完败于VB.net程序员。<br>我们完全可以用&#8220;键盘钩子&#8221;做个小程序来检测、验证一下到底是哪种代码更浪费键盘、书写起来更吃力。（这个程序我已经写好，有兴趣的可以到<a href="http://img.pcpop.com/upimg2/2005/5/15/491525800.jpg">http://img.pcpop.com/upimg2/2005/5/15/491525800.jpg</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来下载。注意：必须使用网络快车下载，下载后把文件更改为exe的即可直接运行。这个序使用VB.net&nbsp;&nbsp;&nbsp; +&nbsp;&nbsp;&nbsp; Framework1.0编写，必要的时候&nbsp;&nbsp;&nbsp; 需要你安装.net框架。）</p>
<p>测试结果很明显：VB.net代码需要按键的次数更少、书写更为容易。原因是IDE在其中起到了极大的作用！<br>VB.net不必像C#那样不停地用Ctrl+shift+B来编译检错；不必不停地按下Shift键来输入星罗棋布的符号；不必不停地使用Ctrl+]徘徊于大括号之间；更不必手动输入众多的&#8220;关闭符&#8221;。<br>（试一试：输入If&nbsp;&nbsp;&nbsp; A=B&nbsp;&nbsp;&nbsp; [回车]，这时&nbsp;&nbsp;&nbsp; Then和End&nbsp;&nbsp;&nbsp; IF马上就都给你准备好了）<br>(再试一试：在一个刚刚建立的新Class中，输入Inherits后&nbsp;&nbsp;&nbsp; 回车，所有需要实现的方法都给你准备好了)</p>
<p>究其本质，是由于VB.net的语言起到了决定性的作用。<br>正是因为我们已经告诉了编辑器&#8220;这是一个ReadOnly&nbsp;&nbsp;&nbsp; Property&#8221;，所以编辑器会给我们自动提供了Get结构代码；<br>正是因为我们已经告诉了编辑器&#8220;这是一个WithEvents的对象&#8221;，所以编辑器会在对象事件选择列表里加入它；<br>正是因为我们已经告诉了编辑器&#8220;这是一个Event&#8221;，所以当我们要RaiseEvent时，它会准确地出现在列表中；<br>正是因为我们已经告诉了编辑器&#8220;这是一个Function&#8221;，所以当我们写上调用方法后，它会自动地在后面加上括号；<br>&#8230;&#8230;<br>反观C#，由于代码过度地萎缩，许多事情还需要通过分析整段代码的结构来决定它的属性，导致这些&#8220;智能的操作&#8221;无法在C#上实现。</p>
<p>但这些动词并不能表明VB.net和C#之间具有什么差距！！！！</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/panjun_websoftware/archive/2008/02/28/2129117.aspx">http://blog.csdn.net/panjun_websoftware/archive/2008/02/28/2129117.aspx</a></p>
<img src ="http://www.cppblog.com/Zezese/aggbug/141416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-03-09 13:47 <a href="http://www.cppblog.com/Zezese/archive/2011/03/09/141416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>