分部类型
拆分一个类、一个结构、一个接口或一个方法的定义到两个或更多的文件中, 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。
分部类
在以下几种情况下需要拆分类定义:
public partial class Employee
{
public void DoWork()
{
}
}
public partial class Employee
{
public void GoToLunch()
{
}
}
partial
关键字指示可在命名空间中定义该类、结构或接口的其他部分。 所有部分都必须使用 partial
关键字。 在编译时,各个部分都必须可用来形成最终的类型。 各个部分必须具有相同的可访问性,如 public
、private
等。
如果将任意部分声明为抽象的,则整个类型都被视为抽象的。 如果将任意部分声明为密封的,则整个类型都被视为密封的。 如果任意部分声明基类型,则整个类型都将继承该类。
指定基类的所有部分必须一致,但忽略基类的部分仍继承该基类型。 各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。 在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。 最终类型是所有部分在编译时的组合。
partial 修饰符不可用于委托或枚举声明中。
下面的示例演示嵌套类型可以是分部的,即使它们所嵌套于的类型本身并不是分部的也如此。
class Container
{
partial class Nested
{
void Test() { }
}
partial class Nested
{
void Test2() { }
}
}
编译时会对分部类型定义的属性进行合并。 以下面的声明为例:
[SerializableAttribute]
partial class Moon { }
[ObsoleteAttribute]
partial class Moon { }
它们等效于以下声明:
[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }
将从所有分部类型定义中对以下内容进行合并:
以下面的声明为例:
partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }
它们等效于以下声明:
class Earth : Planet, IRotate, IRevolve { }
限制
处理分部类定义时需遵循下面的几个规则:
partial
进行修饰。 例如,下面的类声明会生成错误:
public partial class A { }
//public class A { } // 错误, 也必须使用 partial 修饰
partial
修饰符只能出现在紧靠关键字 class
、struct
或 interface
前面的位置。
partial class ClassWithNestedClass
{
partial class NestedClass { }
}
partial class ClassWithNestedClass
{
partial class NestedClass { }
}
有关详细信息,请参阅类型参数的约束。
示例 1
下面的示例在一个分部类定义中声明 Coords
类的字段和构造函数,在另一个分部类定义中声明成员 PrintCoords
。
public partial class Coords
{
private int x;
private int y;
public Coords(int x, int y)
{
this.x = x;
this.y = y;
}
}
public partial class Coords
{
public void PrintCoords()
{
Console.WriteLine("Coords: {0},{1}", x, y);
}
}
class TestCoords
{
static void Main()
{
Coords myCoords = new Coords(10, 15);
myCoords.PrintCoords();
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// 输出: Coords: 10,15
示例 2
从下面的示例可以看出,你也可以开发分部结构和接口。
partial interface ITest
{
void Interface_Test();
}
partial interface ITest
{
void Interface_Test2();
}
partial struct S1
{
void Struct_Test() { }
}
partial struct S1
{
void Struct_Test2() { }
}