Evil 域

当Evil遇上先知

导航

VB 9.0新特性之对象初始化器(Object Initializers)(一)

Posted on 2008-06-13 22:38  Saar  阅读(922)  评论(3编辑  收藏  举报

基于编译器“变聪明”了的缘故,VB 9.0中引入了不少聪明的想法,对象初始化器便是其中一个例子。对象初始化器允许开发人员在一行代码内完成对象的创建以及初始化操作。在《VB 9.0新特性之局部类型推理(Local Type Inference)》一文中,我们创建了一个Notebook类,在创建一个Notebook对象的示例中,我们使用了以下代码:

1        'Infer an instance
2        Dim myNoteBook = New Notebook
3        myNoteBook.Brand = "Lenovo"
4        myNoteBook.Price = 16000
5        myNoteBook.Type = "T61"
6        myNoteBook.Weight = 2.3
7        Console.WriteLine("This is my Lenovo laptop:")
8        Console.WriteLine(myNoteBook.ToString())
在这里,我们首先利用一个VB9.0的匿名类型的新特性,创建了一个名为myNoteBook的对象。然后,对它的四个属性分别进行的赋值操作。作为程序员,我们一直在为着懒惰而努力^_^第3~6行好像很烦啊,能不能在创建对象的时候就把它初始化完呢?我们改写以上代码,把它写成这样:
 1        'Dim myNoteBook = New Notebook() With {.Brand = brand, .Type = type, .Weight = weight, .Price = price}
 2
 3        'Infer an instance
 4        'Dim myNoteBook = New Notebook
 5        'myNoteBook.Brand = brand
 6        'myNoteBook.Price = price
 7        'myNoteBook.Type = type
 8        'myNoteBook.Weight = weight
 9        'Change the form into:
10        Dim myNoteBook = New Notebook With {.Brand = "Lenovo", .Price = 16000, .Type = "T61", .Weight = 2.3}
11        Console.WriteLine("This is my Lenovo laptop:")
12        Console.WriteLine(myNoteBook.ToString())
注意第10行代码,看看这效果,这就是对象初始化器带给我们的,简直太棒了。我实在想说,Hey, this is really what I want :-) ,一行代码,我完成了从对象创建到初始化的所有这些操作。

让我们稍微深入一下,挖掘些有趣的东西。
首先,来看看如果Notebook类中,有带参的构造函数,会发生些什么。我们修改Notebook类,在类中添加以下构造函数:
        Public Sub New()

        
End Sub


        
Public Sub New(ByVal brand As String)
            _brand 
= brand
        
End Sub
然后,把上面的第10行代码修改下:
1Dim myNoteBook = New Notebook("Lenovo"With {.Price = 16000, .Type = "T61", .Weight = 2.3}
2        Dim myNoteBook1 = New Notebook("Lenovo"With {.Brand = .Brand & "1", .Price = 16000, .Type = "T61", .Weight = 2.3}
3        Dim myNoteBook2 = New Notebook With {.Brand = .Brand & "1", .Price = 16000, .Type = "T61", .Weight = 2.3}

对第一行代码,我们使用带一个参数的构造函数来初始化myNoteBook对象的Brand属性。嘿嘿,第2行代码...好像有点让人感觉比较困惑啊—— With {.Brand = .Brand & "1"}的表达方式~~~~这不是会导致递归式的赋值?聪明的VB9告诉我,不会。为什么?
要理解这种形式的代码其实很简单,只要记住对象初始化器的执行顺序是先执行构造函数,然后再对属性赋值;如果属性未初始化过,则使用其默认值。所以,在执行构造函数时,会把.Brand赋为“Lenovo”,然后执行.Brand = .Brand & "1",最后,.Brand = "Lenovo1"。同理,第3行,myNoteBook2的Brand则为"1"。

其次,如果一个类里有另外一个类的对象需要初始化,是不是也可以在一行内完成?
我们假设我的Notebook中有一个硬盘对象,我们定义硬盘的类如下:

Code

然后,修改Notebook类的定义,添加以下代码,增加一个硬盘属性:

 1        Private _hd As HardDisk
 2
 3        Public Property HDisc() As HardDisk
 4            Get
 5                Return _hd
 6            End Get
 7            Set(ByVal value As HardDisk)
 8                _hd = value
 9            End Set
10        End Property
呵呵,接下来,就可以引发一段神奇的代码了:
1        Dim myLaptopWithHD = New Notebook With _
2            {.Brand = "Lenovo", .HDisc = New HardDisk With {.Brand = "Hitachi", .Size = 160}}
3        Console.WriteLine(myLaptopWithHD.HDisc.Brand & myLaptopWithHD.HDisc.Size.ToString())
很显然,我们要使用对象初始化器来初始化一个Notebook——myLaptopWithHD,同时,在第2行中,我们又使用了对象初始化器来创建并初始化了一个日立的160G的硬盘。因此。结论:对象初始化器是可以嵌套使用的。

回顾一下,对象初始化器允许开发人员在一行代码内完成对象的创建以及初始化操作。这是一个有顺序的过程,首先,编译器会根据构造函数,构造出对象;然后,给对象的相应的属性赋值,并且一个属性可以用于初始化其自身。对象初始化器是可以嵌套使用的。


MP3 + 大容量存储 = iPod,这个公式告诉我们,当两个东西结合在一起的时候,就有可能产生新的力量。当对象初始化器与匿名类相碰,会产生什么?请大家关注《VB 9.0新特性之对象初始化器(Object Initializers)(二)