Visual Basic 2008 隐藏彩蛋

[原文作者]:

[原文链接]:Hidden Gems in Visual Basic 2008

    昨天,我答应写一篇关于 Visual Basic  Visual Studio 2008里隐藏彩蛋的文章,这些彩蛋是你们在博客帖子或会议上从未见过的。我曾提及到了一些我最喜爱的特性,在BataⅠ版本的阐述中我尽情炫耀了智能感知(intellisence)的改进,尤其是对关键字、本地变量和表达式,自动完成语句的改进。在那篇文章中,我也提到一种语法新特性非严格委托(Relaxed Delegates),它允许你为事件(event)提供一个可替代的签名(alternate signatures)。这些都是很棒的特性但我要告诉你一些玩意!
    经过队员们的民意调查,最终我们挑选出了10个最重要的特性,我以前的文章里没有提及过的。我这里只是简单介绍,有兴趣的朋友可以继续研究。首先 ,我必须从基调特性(keynote feature)开始讲……
 
0)    多个 target Framework 支持(Multi-targetting

    简单的说,Multi-targetting支持你在VS2008VB9下用.NET 2.0 framework 进行编译。下面我将要讲到的所有特性都在.NET 2.0下有效,所以当你打开Visual Studio 创建一个project以后,把framework target设置为2.0(除了第5和第7项,因为它们需要LINQObjectsXML APILINQ是在.NET 3.5才推出)。

1)    输入推断(Type Inference
    Visual Basic 9里面,下面的这一小段代码以及Nothing都是延迟绑定(late-bound——在编译时(compile tine)一切都是延迟绑定,这就意味着你可以得到智能感知和输入推断。 
Dim dialog = New OpenFileDialog()       
Dim result = dialog.ShowDialog()       
Dim printStr = "C\"       
If result = Windows.Forms.DialogResult.OK Then           
printStr = dialog.FileName       
End If       
MsgBoxprintStr 
    这使得在输入代码时更加快捷,简单和准确。 这个特性和控制它的机制你可以在我们QA team里的Bill Horst写的文章里得到详尽描述。
2)    IF操作符
    还记得吗,IIF函数能返回一个对象(Object),这意味着你不需要通过智能感知或类型推断就可以得到默认的返回值(Object类型)。如果你坚持要类型安全或代码前绑定,可以强制转换,代码如下: 
 Dim intC As Integer = CIntIIfintA = intB intA intB – 1)) 
    现在用IF操作符,你可以这么写: 
Dim intD As Integer = IfintA = intB intA intB 
     如果加上类型推断,代码就更简单了: 
 

    我本人是能提高易读性的特性的坚定拥护者。
3)    对象初始化(Object Initializers
     总的来说,在.net framework里,对象初始化是一种类似于把Dimstatement combined整合在一起的表达式。这样使得参数构造器多少让人容易接受一些: 
Dim strm As New StreamWriter _                 
New FileStream"C\out.txt"FileMode.OpenOrCreate _                        
With {.Position = 10} 
    对象初始化使得创建一个数组对象更加容易: 
Dim Capitals() As City = {New City With {.Name = "Antanarivo" .Country = "Madagascar"} _
New City With {.Name = "Belmopan" .Country = "Belize"} _
New City With {.Name = "Monaco" .Country = "Monaco"} _New City With {.Country = "Palau" .Name = "Koror"}}
4)    允许空值(Nullable
    Nullable 是一种特性,可能你知道但没有关注过。它是一个基本的.NET 表达式,专门针对nullable 类型(整数,日期,等等)。在 LINQ  SQL 中使用 Visual Studio 2008中引入的对象相关映射层这个设计器,数据库中的可空行都被映射成为这种类型。其结果是你可以在VB中写出像下面这样的表达式,而得到正确的结果其中的空属性以null值传播。例如下面这点代码,在Country type中有个independence property nullable date 
Dim virginIslands As New Country With {.Independence = Nothing}       
Dim palau As New Country With {.Independence = #10/1/1994#}        
Dim vILength = #8/24/2005# – virginIslands.Independence ‘ Nothing       
Dim pLength = #8/24/2005# – palau.Independence ‘ 3980.000000
5)    LINQ to DataSet
     我爱死这个特性了,因为它意味着你可以不用调用其他数据访问技术就能收获LINQ的好处。我先填充了一个 DataSet,然后就可以对这个DataSet进行查询。 
Me.EmployeesTableAdapter.FillMe.NORTHWNDDataSet.Employees       
Dim query = From emp In Me.NORTHWNDDataSet.Employees _                   
Where emp.Country = "USA" _                   
Order By emp.HireDate _                   
Select emp       
Me.EmployeesBindingSource.DataSource = query 
6)    语法提示(Syntax Tooltips 
 
     

    再看看这个 

    还有这个

 

7)    XMLnamespace支持智能感知
    之前我们已经在博客上讲到过XML Intelligence,但是我们忽视了一点。
namespace被用在XML 文档中时,智能感知会对namespace前缀和local name进行匹配,你只要为输入带来很大便捷,你只要输入开头几个字母然后回车,VS会帮你找到匹配的字段并加上相应的前后缀。下面是个小例子,以一个输入文件开始,然后使用智能感知。
 

    此时我们只输入字母tVS会自动选中tomato 
 
 

8)    转到类型定义(GoTo Type Definition
    通常,当你定义了一个变量,你想通过Object Browser浏览它在代码中的类型定义的时候,现在你多了一种选择,通过context menu可以让你直接找到它的定义。这点非常好,尤其是涉及到类型推断时能帮你确定该变量的类型是否和你想象的一致。 
 
 

9)  循环变量的输入推断(Type inference for loop variables
    检查下面这段代码: 
 
    还有这段:
 
 

     如果没有指定控制变量的类型,它会根据表达式或循环的信息从右往左推断。

10)    性能的提高以及非封闭性操作 
    后台编译器有一个非常强大的特性,它可以给你及时地反馈只要你写的代码正确。在这个版本的Visual Studio中我们对后台编译器做了很大的改进,我们相信后台编译器比以前快3倍但只用原先1/3的内存。任何使用过VS2008 的人都会意识到这一点。虽然我们在性能上做了很大的改进,但是在大项目里面某些操作符仍然是一个巨大的花费,例如改变一个base classdeclaration 通常会被多次用到。如果在后台编译器工作之前,你试图调用一些依赖于编译信息的特性(例如IntellisenceDrop Downs),在以前版本的VS中会有一个长时间的停顿直到编译完成为止,但是现在这个问题解决了,当你想得到drop downs的时候就像这样: 
 
    集成开发环境照样能够响应用户操作。 

发表评论