RSS 2.0 Feed
2004-06 Entries
摘要:因为博克堂的帖子分类目前只能保存12篇帖子,所以我准备一个阶段索引。从这个索引可以方便地访问到较早的文章。本系列基于预览版本完成,不保证所有新功能在正式版本中有一致的表现。 Visual Basic 2005新功能点评(十一)——编辑后继续运行 Visual Basic 2005新功能点评(十)——异常助手 Visual Basic 2005新功能点评(九)——插入代码片断 Visual Basic 2005新功能点评(八)——运算符重载 part.3 Visual Basic 2005新功能点评(七)——运算符重载 part.2 Visual Basic 2005新功能点评(六)——运算符重载 part.1 Visual Basic 2005新功能点评(五)——自定义事件过程 Visual Basic 2005新功能点评(四)——不完全类型 Visual Basic 2005新功能点评(三)——错误纠正、重构支持 Visual Basic 2005新功能点评(二)——有用的小语法 Visual Basic 2005新功能点评(一)——带有不同可见性级别访问器的属性 下期将介绍“无符号整型”,预定时间:7月1日...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:关键字:VB8.0 VB.NET Whidbey Edit and Continue E&C VB2005 我们都有调试程序的经验,当程序发生了异常或遇到断点中断执行时,如果我们发现代码中有问题需要修改,一般的开发工具需要完全重新编译后再次运行到此处才能检验是否修改正确。有时候项目重新运行到所需位置的速度很慢或者操作非常复杂时,完全编译再调试的执行方式就显得十分笨拙和低效。在Visual Basic还能够解释执行的时代,Visual Basic程序员都有一项非常便利的调试手段,那就是编辑后继续运行。我们可以在程序中断的情况下修改代码,然后立即从此处继续运行,有时甚至可以跳过出现异常的语句进行下去。这样,即使我们要反复修改代码并运行,也可以完全在调试时进行,这是多么方便。不过Visual Basic .NET没有这一功能,这让很多Visual Basic程序员十分扫兴,因为这是VB开发中的巨大优势之一。Visual Basic 2005重新加入了这一功能,让广大Visual Basic程序员又可以享受编辑后继续运行带来的便利。这一特性是在CLR层次上实现的,因此理论上任何建立在CLR上的语言都可以实现编辑后继续运行,但是Visual Basic在所有语言中最适合拥有这个特征,因为Visual Basic在书写代码时就立即编译,只有这样,中断时作出的修改才有可能立刻得以运行。在Visual Studio 2005中,目前也确实只有Visual Basic 2005带有这个功能。 演练 首先我们看看编辑后继续运行是如何工作的。这段代码将产生被零除的异常,我们用它来展示编辑后继续运行的功能: Dim i, j As Integeri = 1j = 0MsgBox(i \ j) 运行这段代码,我们将得到一个运行时异常,如图所示。 根据异常助手的指示,我们发现问题在于j在运行时被赋予0,而在进行除法时没有对j的值进行验证。这时,关闭异常助手,便可以立刻修改代码。比如我们修改成 If j <> 0 Then MsgBox(i \ j) 我们注意到编辑器左边有个黄色的箭头。那个箭头叫做instruction pointer,指示是将要执行的代码。如图所示: 现在我们就可以单击“运行”按钮继续运行了,正如预期的那样,异常不再发生。在中断状态,我们甚至可以手工控制运行的流程,而这个操作简单到只需动动鼠标。举个例子,假设刚才的错误发生时我们希望更改对j的赋值语句,然后运行看效果如何,那么我们可以在刚才中断下来的时候,将代码改为: Dim i, j As Integeri = 1j = 1MsgBox(i \ j) 这时黄色的箭头指向MsgBox语句,如果直接继续运行还是错误的结果。于是我们可以拖动黄色的箭头,使它指向j的赋值语句。如图所示: 接下来单击“运行”按钮,立刻就能看到弹出的消息框显示了正确的结果。 限制 Visual Basic 2005的编辑后继续运行功能是有一些限制的,比如将断点处的语句用With或SyncLock语句包围、移除局部变量的定义、改变循环语句或者改变调用堆栈中某方法的调用语句等等都不能继续运行。此外所有使用了泛型的语句修改后大都不能继续运行。这些限制是由CLR内部的工作原理引起的。关于具体的限制,MSDN的文档将会有详细的描述。 即使存在这些限制,我们的编辑后继续运行功能已经非常强大了,使用编辑后继续运行可以大大提高调试的效率,节约时间,而且对于初学者来说更易于学习和接受。 下期预告 未来几期介绍的是XML文档注释、无符号整数、Attribute编辑器和可视化调试环境等功能。如果你希望这些功能中的某个功能先介绍,可以在评论中表明你的想法。...[阅读全文]

posted @ | Feedback (122) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:Avalong和Windows Forms的对象模型是不是很不相同?那为什么可以通过一种交互控件实现在Avalong窗体上使用Windows Forms控件或者在Windows Forms窗体上实现Avalong控件?我没有Longhorn,没有办法进行这种实验,以至于我对这种交互有很深的好奇心。 如果这个能做到,为何不能实现Delphi 8的VCL.NET与Windows Forms的交互?我想VCL与Windows Forms的不同导致Delphi程序员必须接受两套不通用的窗口界面的框架是阻碍Delphi程序员升级到.NET的一大原因。 闲话而已,自己没有能力深究这个问题。...[阅读全文]

posted @ | Feedback (5) | Filed Under [ 闲话集锦 ]

摘要:关键词:VB2005 VB.NET Whidbey VB8.0 C# 在使用Visual Basic .NET开发的过程中,我们都有以下经验,那就是VB.NET在编译错误方面给出的帮助很详细,可以很方便地找到解决问题的方法,但运行时错误就差多了,比如我们书写了下面的代码: Dim b As Buttonb.Text = "Hello" 当代码运行到此处时,只会弹出下面这样一个窗体: 一句“未将对象引用设置到对象实例”难倒了多少人。对于初学者,他们根本不知道这意味着什么,更不要提解决问题了。不要指望那个“帮助”按钮有什么帮助,他只是解释一下什么叫异常窗口,声么叫“中断”等等毫无关系的内容。这样的异常窗口对开发着的帮助实在非常有限,他甚至不能链接到关于异常类的文档。这样的异常窗口甚至不如VB6提供的信息多,这导致更多VB6程序员在升级到VB.NET时遇到阻碍。Visual Basic 2005以及在Visual Studio 2005中的C#和J#语言新增了异常助手功能,很大程度上解决了这个问题。如果我们在VB2005中输入上述代码,运行时将得到如下一个窗口: 这就是异常助手,他分为三个部分:首先像VB.NET一样提供了异常对象所附带的信息,再有就是两个新的部分:Troubleshooting Tips和Actions。Troubleshooting Tips是关于异常的帮助,不仅仅是异常类的文档,还有特定语言如何解决问题的指南。比如NullReferenceException就提供了一篇Troubleshooting NullReferenceException Exceptions ,其内容摘录如下: Use the New keyword to create the instance. You may have tried to use an object without providing an instance of the object. For example, Dim CustomerTable As DataTable should be rewritten as Dim CustomerTable As New DataTable. Include a code block that checks for null references. Programmatically check to determine if a function has returned null (Nothingin Visual Basic) instead of an instance of an object. Explicitly catch NullReferenceException in a Try…Catch…Finally statement. A Try…Catch…Finally statement......[阅读全文]

posted @ | Feedback (8) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:经过三个月左右的努力,终于将这个软件的雏形做出来了,现在虽然只有2000多行代码,但是项目启动以后我会继续完善它的。它的Codename是Structure Studio. 虽然这是一个用于分子动力学模拟的程序,但其中某些组件对于其他应用是有帮助的,比如包含一个对无格式文本文件进行描述和解析的功能,其初衷是处理包含大量数据的分子模拟轨迹文件。做出来以后,性能比我想象的要高些,处理192万行的轨迹文件只需要30秒,这对于我这种模型已经不错了。它还包括一组有关向量计算的类库和求取分子几何信息的工具。未来还会加入对CML的支持。最近的任务是对其中多个性能瓶颈试用泛型重写。 要发布到开源社区上,得想一个协议,不知道用什么好。...[阅读全文]

posted @ | Feedback (11) | Filed Under [ 灵感记录 ]

摘要:关键词:VB2005 VB.NET Whidbey VB8.0 Visual Basic 2005吸引人的地方之一就是它大幅增加了开发效率,其中一大体现就是本期要介绍的插入代码片断。代码片断大家都很熟悉,就是一些常见短小的代码。我们在开中常常遇到一些反复使用的代码片断,比如Try...Catch块、操作字符串和访问注册表的代码等等。每次输入这些代码十分麻烦,因为每次使用大部分都很相似,只有少数地方有变化,却要照单输入。Visual Basic 2005为我们增加了“插入代码片断”的功能,可以用鼠标轻轻一点,就插入我们所需的代码片断。Visual Basic 2005已经内置了大量的片断,因此遇到我们不熟悉的任务时,可以先看看有什么现成片断可以用,实在是方便极了! 首先我们看看如何插入代码片断,在要插入片断的地方单击鼠标右键,然后选择“Insert Snippet”,如图所示: 接下来就会弹出一个选择代码片断类别的菜单。有相当丰富的类别可用,如访问数据、网络连接、Visual Basic语言和Windows操作系统等等。如图所示: 每个类别下面都有很多片断,片段的内容设计到播放音乐、读取XML文件、遍历窗体控件等等。如图所示: 现在我们插入一个片断试试看,比如“求两个日期的间隔”,这曾经是个网络上相当普遍的问题。插入片断后显示如下的代码: ' Click for more: 'ms-help://MS.VSCC.v80/MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="688f80b8-002b-49eb-833e-738041b81508"'Dim oldDate As Date = #1/1/2002#Dim newDate As Date = NowDim differenceInDays As Long = DateDiff(DateInterval.Day, oldDate, newDate)Dim spanFromDays As TimeSpan = New TimeSpan(CInt(differenceInDays), 0, 0, 0) 这里面有几个相当有趣的地方,首先那条注释中包含了关于此片断帮助的链接,如果对此片断的功能有疑问,可以直接通过链接查看帮助(多么体贴的设计)。注意代码中有两处黄色区域,这些是可替换代码的区域。单击Tab键,光标将自动在所有可替换区域之间跳转。如此可以快速地将这些区域替换成自己的内容。这些替换区域可以长时间保持可替换状态。 在过程内部可以插入的片断与在类/结构的声明区域或命名空间中可插入的片断是不一样的。比如下面这个片断只能在类的声明区域插入,其作用是响应系统桌面变化的信息: ' Click for more: 'ms-help://MS.VSCC.v80/MS.MSDNQTR.80.en/commoner/redir/redirect.htm?keyword="2e578cf5-b675-4ffe-a91f-17be0015df36"'Private Sub HookUpEvent()    AddHandler Microsoft.Win32.SystemEvents.UserPreferenceChanged, _        AddressOf UserPreferenceChangedSubEnd SubPrivate Sub UserPreferenceChangedSub(ByVal sender As System.Object, _    ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs)    If (e.Category = Microsoft.Win32.UserPreferenceCategory.Desktop) Then        MsgBox("Desktop changed.")    End IfEnd Sub 这段代码的功能一般的VB程序员很难写出,如果没有插入片断,不知道要费多少功夫了。除了内置的片断以外,我们还常常需要插入自己想要的代码。比如对于我来说,我常常需要书写一个将私有字段封装为属性的代码片断。对于这种需求,Visual Basic 2005还提供了“创建代码片断”的功能。如图,现选中想要制作成片断的代码,再从上下文菜单中选择“Create Snippet”功能。 接下来,我们可以通过片段设计器设置片段中的可替换区域,所属类别等信息,如图所示: 所有可插入的片断在实质上都是一小段XML代码。这项功能在当前版本的Visual Studio 2005预览版本中还没有完成,我们期待在正式版本中更佳表现。 下期预告 下期介绍另一个IDE的功能:异常助手...[阅读全文]

posted @ | Feedback (12) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:关键字 VB2005 VB.NET Whidbey 本贴是运算符重载的最后一期,首先介绍重载类型转换运算符CType。首先我们复习一下CType与VB其它类型转换运算符的功能: CType用于将一种类型转换为另一种类型,这种转换可以是装箱、拆箱、接口转换、父类转换、用户定义的转换等。有一些转换,如从String到Integer的转换是.NET不支持的,但是VB内建了转换的规则。 DirectCast只能将类型转换为其运行时的真实类型,比如从装箱的Object类型还原为值类型。DirectCast在进行拆箱操作时比CType更快。不能重载此运算符。 TryCast运算符是VB2005新增,它结合了DirectCast和类型判断的功能。如果类型转换能够成功,它将返回转换的结果。而如果不能成功,则返回Nothing,不会产生异常。TryCast也不能重载,而且它不能用于值类型的转换。用过C#中as运算符的人应该可以很快理解TryCast的功能。 我们重载CType一般是用于定义两种不同的类型之间的转换,比如Integer到Decimal的转换等。在重载它时,我们必须明确转换是“扩大转换(Widening)”还是“缩小转换(Narrowing)”。扩大转换的意思是转换的源类型A的一切可能值或实例都能转换成目标类型B的值或实例。缩小转换则是指A中存在不能成功转换为B的值或实例。如Integer的所有值都能转换为Long,因此Int32到Int64的转换是Widening的;而Decimal中不是所有值都能转换成Long,Decimal可以表示Long无法表示的超大数值,他们将导致转换失败,因此从Decimal到Int64的转换就为Narrowing的。 真实中常见的类型转换大都是Narrowing的,因此重载CType时常进行Narrowing重载。只有确信需要时才采用Widening重载,而且如果定义了A到B的Widening转换运算符重载,那么从B到A的转换就不应该是Widening的,否则在同时需要A、B类型作参数的场合就无法分辨二者的实例。下面我们看CType运算符重载的语法 <attributes> Public Shared {Narrowing|Widening} Operator CType _    (srcVar As SourceType) As TargetType 正如我们前面介绍的,重载CType时必须指定这种类型转换为Narrowing还是Widening。同时SourceType和TargetType中有一个必须是定义此运算符的类型。书写重载过程的主要任务是根据srcVar变量的内容生成一个新的TargetType的变量。下面我们演示定义复数于实数类型的转换运算符。我们知道只有复数的虚部为0时才能转换为实数,因此复数到实数的转换为Narrowing,而所有实数都能转换为复数,因此实数到复数的转换为Widening。 Public Shared Narrowing Operator CType(c As Complex)As Double    If c.ImaginaryPart <> 0 Then        Throw New InvalidCastException( _            "无法将虚部不为零的复数转化为实数")    Else        Return c.RealPart    End IfEnd OperatorPublic Shared Widening Operator CType(r As Double) As Complex    Return New Complex(r, 0)End Operator 我们可以看到,在Narrowing转换中必要的内容是对无法转换的情况抛出异常,而Widening转换应确保所用的语句不会产生异常。在VB.NET中,无论是Widening转换还是Narrowing转换,通常都可以省略CType运算符不写(在其他语言中称隐式转换),不过省略Narrowing转换的CType会给出警告,而且在Option Strict打开的情况下无法通过编译。比如下面的代码可以通过编译并正确运行,虽然Int32到Int16的转换是Narrowing的: Dim s As Short = 10I 但是若将Option Strict打开,这段代码就无法编译,因为从Integer到Short的转换不是总能成功的,而这样的写法不能给开发者带来这一认识。 最后我们来了解一下符合CLS设计的原则: 1、每个运算符重载都应该提供一个相同功能的,符合CLS的方法。比如+运算符提供Add方法,CType运算符提供ToType方法等等。 2、在结构中使用运算符重载,而在类中慎用。一般重载=和<>这样的运算符比较常用,而特殊的运算符,如&、^或Like不要随意重载。 3、注意各种语言对不同运算符的支持,可以查看我的对照表来确定。 下期预告 未来几期我将分别介绍几种万众瞩目的IDE改进,他们是“插入片断”、“异常助手”和“编辑后继续运行”。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 技术随笔 Visual Basic 2005 新功能点评 ]

摘要:GotDotNet上发布了一个项目——Visual Basic Power Pack,这是一个控件集,都是很流行很酷的功能: ·         BlendPanel. 提供窗体背景渐变的功能。 ·         UtilityToolbar. 提供外观类似于IE工具条的控件。 ·         ImageButton. 提供可带透明背景图片的按钮控件。 ·         NotificationWindow. 这是一个弹出式窗口,就像提示气球那样的东西 ·         TaskPane. 一个容器控件,提供可折叠的框架。 ·         FolderViewer. 显示所有文件夹的控件,不是对话框而是控件哦! ·         FileViewer. 显示文件夹中所有文件的控件,我知道很多人在找这个东西。 完全由Visual Basic  .NET 2003编写(估计也能用于C#,对上述功能有需要的可以看看),提供源代码。快下载吧。...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 闲话集锦 ]

摘要:在Visual Basic等语言中,事件是经过特别封装的Delegate变量,它可以确保事件机制的进行,却又不允许从对象的外部引发事件或者获取不是自己绑定的事件处理的信息。所有这些,都是通过“事件过程”来做到的。当你书写一个事件的定义时: Public Event MyEvent As EventHandler 实际上是书写了一个私有的委托变量和两个公共方法——add_MyEvent方法和remove_MyEvent方法。 Private _MyEvent As EventHandlerPublic Sub add_MyEvent(value As EventHandler)    _MyEvent = CType(Delegate.Combine(_MyEvent, value), _        EventHandler)End SubPublic Sub remove_MyEvent(value As EventHandler)    _MyEvent = CType(Delegate.Remove(_MyEvent, value), _        EventHandler)End Sub 当你调用下列语法为事件绑定处理过程时: AddHandler obj.MyEvent, AddressOf MyProc 实际是调用了obj.add_MyEvent方法: obj.add_MyEvent(AddressOf MyProc) 通过这种方法,私有的委托变量被完全封装起来,因此从对象外部直接访问它是不可能的。这种自动的事件过程为我们提供了很大的方便,但不能满足一些高级的要求。比如我们想维护一个自定义的委托列表,供所有子类的事件使用,就没有办法使用自动生成的事件过程,而必须要用新的自定义事件过程。自定义事件过程就是手工实现事件的add_EventName方法和remove_EventName方法。其语法是 modifiers Custom Event EventName As HandlerName