细说.Net开发中的Visual Basic.Net(2)_.Net教程
推荐:怎么在ASP.NET中使用SmtpMail发送邮件在ASP中,就可以通过调用CDONTS组件发送简单邮件,在ASP.NET中,自然也可以。不同的是,.Net Framework中,将这一组件封装到了System.Web.Mail命名空间中。 一个典型的邮件发送程序如下: <%@ Import Namespace=System.Web.Mail %> <script runat=server
易于反编译的中间语言
无论你用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 过程以使他们的客户程序能取回值。我希望我能为这个改变找到一个合适的理由,可是我找不到。
分享:谈.Net和Java的socket机制比较socket是基于TCP和UDP协议的高层接口,定义了收发数据的格式。Java的TCP服务中使用的Socket是一种流机制,即对于编程人员来说,处理socket只需要从Socket中获取流,然后可以像处理本地流一样来进行数据的收发。 例如: DataOutputStream outToClient =new D
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP发送Email实例(可带附件)
- js实现广告漂浮效果的小例子
- asp.net Repeater 数据绑定的具体实现
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
- Asp.net获取客户端IP常见代码存在的伪造IP问题探讨
- VS2010 水晶报表的使用方法
- ASP.NET中操作SQL数据库(连接字符串的配置及获取)
- asp.net页面传值测试实例代码
- DataGridView - DataGridViewCheckBoxCell的使用介绍
- asp.net中javascript的引用(直接引入和间接引入)
- 三层+存储过程实现分页示例代码
- 相关链接:
- 教程说明:
.Net教程-细说.Net开发中的Visual Basic.Net(2)。