不完全类型(Partial Types)的概念首先源于将同一个类分布在多个文件中完成的需求。以前,类或结构必须在同一个文件中完成,当类型变得很大,或许多开发人员需要同时开发一个类型时,这种一个文件的缺点就越来越明显了。Visual Basic 2005允许在多个文件中储存一个类型的“Partial”,这些不完全类型能在编译时组成一个完整的类型。这种技术还可以用于分离IDE自动生成的代码及用户书写的代码,以及孙展波提到的,在ASP.NET和Avalon中分离工具生成的代码及用户书写的代码。

Visual Basic 2005的不完全类型的语法与C#不太一样,其主要特点是:

1、Partial是关键字。C#受限于ECMA的标准,不能任意添加关键字,因此像partial或yield等均不是关键字。而Visual Basic不受标准限制,Partial是作为关键字出现的,不能用作标识符。

2、只有类或结构可以有Partial类型,模块是不能Partial的。

3、一个类的所有Partial类型的定义中,有一个可以不加Partial关键字。当使用Partial关键字时,IDE会自动提示扩写哪个类型:

4、在各个Partial类型上定义的修饰符、Attributes、继承和实现接口是叠加关系,比如一个MustInherit Class A和一个Partial Friend Class A在一起,就会形成一个Friend MustInherit Class A。当然这些修饰不能互相冲突,一个是Public而另一个是Private可不行。

5、在一个Partial类型上声明实现的接口可以在另外一个Partial中实现,一个Partial上声明继承的类的成员也可以在其他Partial中重写。任何时候在任何一个Partial类型中,感觉都同一个完整的类型内部没有区别。

6、Partial类型中定义的嵌套类型也可以写成Partial类型。

下面的例子展示了Partial Type的多种用法

Friend Class Class2
    Inherits Class1

    'MustOverride需要类型定义为MustInherit
    '该修饰符在另外一个Partial定义上

    Public MustOverride Sub Test()

    Public Function Clone() As Object _
        Implements System.ICloneable.Clone

        '实现另外一个Partial中书写的接口
    End Function


    Partial Class IntClass '内部定义的嵌套类也可以Partial

    End Class
End Class


'另一个文件中
Partial MustInherit Class Class2
    Implements ICloneable

    Public Overrides Sub Test1()
        '重写另外一个Partial中继承类的方法
    End Sub

    Public Class IntClass '内部定义的嵌套类也可以Partial

    End Class
End Class

Visual Basic 2005和Visual C# 2005现在都采用不完全类型来储存IDE生成的窗体代码。将自动生成的代码放到一个FormXX.Designer.vb中,这样窗体类就比以前采用Region折叠的方式更加简洁,同时更能够防止用户无意中修改自动生成的代码。