Visual Basic 2008中的隐藏特性

[原文作者]Amanda Silver

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

 

昨天我答应写一些大家在以前的博客中没有看到的关于Visual BasicVisual Studio 2008的新东西,我把它叫做隐藏宝石。我曾提到过在VS2008中的一些特性我很喜欢,还炫耀过智能感知(Intellisense )的改善,尤其是对关键字、本地变量和表达式,自动完成语句的改进。在过去,我还提到过一个新的语法特性,称之为Relaxed Delegates,它允许你为事件(event)提供一个可替代的签名(alternate signatures)。以上这些都是很好的特性,但我今天要说的不是这些,是隐藏宝石(可能这些你在一些C#的文章中见过了,Visual Basic 2008中一样炫)

      我挑选出了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 InferenceVisual 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       

MsgBox(printStr)

这使得在输入代码时更加快捷,简单和准确。 

2)   IF操作符还记得吗,IIF函数能返回一个对象(Object),这意味着你不需要通过智能感知或类型推断就可以得到默认的返回值(Object类型)。如果你坚持要类型安全或代码前绑定,可以强制转换,代码如下:

Dim intC As Integer = CInt(IIf(intA = intB, intA, intB - 1))

现在用IF操作符,你可以这么写:

Dim intD As Integer = If(intA = 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)NullableNullable 是一种特性,可能你知道但没有关注过。它是一个基本的.NET 表达式,专门针对nullable类型,主要用于LINQNullable支持你写一段代码,其中的属性以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.00:00:00 

5)  LINQ to DataSet它意味着你可以不用调用其他数据访问技术就能收获LINQ的好处。先填充一个DataSet,然后就可以对这个DataSet进行查询。

Me.EmployeesTableAdapter.Fill(Me.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看看这个是不是很cool

再看看这个

还有这个

7)  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         通常会被多次用到。如果在后台编译器工作之前,你试图调用一些依赖于编译信息的特性(例如IntellisenseDrop Downs),在以前版本的VS中会有一个长时间的停顿直到编译完成为止,但是现在这个问题解决了,当你想得到drop downs的时候就像这样:

VS很快会有响应。