一、partial
它是一个关键字修饰符。可以将类或结构、接口或方法的定义拆分到两个或更多个源文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。修饰符不可用于委托或枚举声明中。
二、分部类
在以下几种情况下需要拆分类定义:
处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。 Visual Studio 在创建 Windows 窗体、Web 服务包装器代码等时都使用此方法。 无需修改 Visual Studio 创建的文件,就可创建使用这些类的代码。
简单示例
public partial class Test
{
public int Id { get; set; }
public string Name { get; set; }
public void ShowAge()
{
Console.WriteLine($" My age is {this.Age}");
}
}
public partial class Test
{
public string Age { get; set; }
public void ShowNewAge()
{
ChangeAge();
Console.WriteLine($" My new age is {this.Age}");
}
private void ChangeAge()
{
this.Age = "20";
}
}
class Program
{
static void Main(string[] args)
{
var test = new Test() { Id = 1, Name = "1", Age = "11" };
test.ShowAge();
test.ShowNewAge();
var info = $" name:{test.Name},age:{test.Age}";
Console.WriteLine(info);
}
}
编译时会对分部类型定义的属性进行合并;将从所有分部类型定义中对以下内容进行合并:XML 注释、接口、泛型类型参数属性、class 特性、成员
public class TestBase { }
public interface ITest
{
void ShowAge();
}
[SerializableAttribute]
public partial class Test: TestBase
{
public int Id { get; set; }
public string Name { get; set; }
public void ShowAge()
{
Console.WriteLine($" My age is {this.Age}");
}
}
[ObsoleteAttribute]
public partial class Test: ITest
{
public string Age { get; set; }
public void ShowNewAge()
{
ChangeAge();
Console.WriteLine($" My new age is {this.Age}");
}
private void ChangeAge()
{
this.Age = "20";
}
}
它们等效于:
[SerializableAttribute]
[ObsoleteAttribute]
public class Test : TestBase,ITest
{
//...
}
如果将任意部分声明为抽象的,则整个类型都被视为抽象的。 如果将任意部分声明为密封的,则整个类型都被视为密封的。
//抽象类示例
public partial class PTest {}
public abstract partial class PTest { }
class Program
{
static void Main(string[] args)
{
//PTest PTest = new PTest();//提示:无法创建抽象类或接口"PTest"的实例
}
}
//密封类示例
public partial class STest { }
public sealed partial class STest { }
//public class SubTest: STest { }
三、分部方法
分部类或结构可以包含分部方法。 类的一个部分包含方法的签名。 分部方法声明由两个部分组成:定义和实现。
但是它的限制很多,只能在部分场景下使用。
分部方法声明必须以上下文关键字 partial 开头,并且方法必须返回 void。
分部方法可以有 ref 参数,但不能有 out 参数。
分部方法为隐式 private 方法,因此不能为 virtual 方法。
分部方法不能为 extern 方法,因为主体的存在确定了方法是在定义还是在实现。
分部方法可以有 static 和 unsafe 修饰符。
分部方法可以是泛型的。 约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。 参数和类型参数名称在实现声明和定义声明中不必相同。
你可以为已定义并实现的分部方法生成委托,但不能为已经定义但未实现的分部方法生成委托。