科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件.Net开发 细说Visual Basic.Net

.Net开发 细说Visual Basic.Net

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

微软公司提出的.NET概念,正从各个方面渗入到我们的生活中。

作者:开发之家 来源:天极网 2007年11月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

易于反编译的中间语言

无论你用VB、C#或其它.NET语言编写应用程序,VS.NET代码都编译成为中间语言(IL)。当应用程序运行时,一个即时编译器(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造成的体系结构差别要比跨语言集成、共享功能和被管理代码等深刻。首先,Visual 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 Hollis 提供了语法变化的详细列表,包括废弃的关键字列表,但有些东西需要在这里重复一下。

首先,向过程参数传递数据的默认方法由引用(ByRef)变成了传值(ByVal)。这个改变主要是因为引用要比传值的风险大得多。它的风险主要是调用过程中的数据可能被无意中篡改。你仍然能通过引用传递数据,但这一改变使你需要修改新的默认调用方法来使用引用。

其次,Set 语句消失了。在 VB.NET 里如果你需要向变量传递一个对象引用,所需要的只是一个等号,对象被视为同其它值一样。这很酷,但也有副作用:默认属性消失了。例如,你不再能用这种方式引用一个属性:

以下是引用片段:
Text1 = "What, me worry?"

作为替代,你必须显式地引用属性:

以下是引用片段:
Text1.Text = "What, me worry?"

也许一眼看来不需要这种改变,但确实必须去掉默认属性。例如,假定你有一个叫objFoo的对象变量,不用Set语句,下面的语句所设置的引用就产生了歧义性:

以下是引用片段:
objFoo = Text1

这条语句是应该设置到Text1的引用,还是以Text1的Text属性来填充objFoo?你不能确定,编译器也不能。抛弃Set语句同时要求抛弃默认属性。

有一个改变我不喜欢:你不再能在不同的作用域里声明Property Get和Property Set过程。注意 VB.NET 没有 Property Let 语句:对象和数值都用 Property Set。这意味着你不能用一个 Friend Property Let 过程来对应一个 Public Property Get。用VB建立组件时可能会有麻烦。许多组件开发者创建 Friend Property Set 过程以使他们的应用程序能改变一个值,但提供 Public Property Get 过程以使他们的客户程序能取回值。我希望我能为这个改变找到一个合适的理由,可是我找不到。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章