C# partial 关键字

本文深入探讨了C#中部分类的使用原因及其应用场景,解释了为何新建的WindowsForm会采用部分类形式,并详细介绍了部分类的特性、限制及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们新建一个Windows Form时,后台代码都会自动添加如下代码:

 Form1.cs

public partial class Form1 : Form
 {
     public Form1()
     {
          InitializeComponent();
     }
 }

 Form1.Designer.cs 

 partial class Form1
{
}

为什么类Form1要用partial修饰?partial主要用在哪些地方?

       为什么新建立的Winows Form的类定义成了一个部分类。我们打开Form1.Designer.cs文件,可以看到,原来Form1的另一部分类是在这个文件中设计的。这个部分类中定义了我们使用的控件、事件委托以及如Dispose方法等。因为这里面的代码都是自动生成的,因此设计成了一个部分类。

Partial是局部类型的意思。允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类

 

局部类型适用于以下情况:
(1) 类型特别大,不宜放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
(3) 需要多人合作编写一个类。

局部类型的限制
(1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
(2) 同一个类型的各个部分必须都有修饰符 partial。
(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4) 一个类型的各个部分必须被同时编译。

3. 局部类型的注意点

(1) 关键字partial是一个上下文关键字,只有和 class、struct、interface放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
(2) 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。

4. 局部类型的应用特性
在局部类型上的特性具有“累加”效应。

[Attribute1, Attribute2("Hello")]
partial class Class1{}

[Attribute3, Attribute2("Exit")]
partial class Class1{}


相当于

[Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")]
class Class1 {}


注:Attribute2属性允许在类上多次使用。

5. 局部类型上的修饰符

(1) 一个类型的各个部分上的访问修饰符必须维持一致性。
(2) 如果一个类型有一个部分使用了abstract修饰符,那么整个类都将被视为抽象类。
(3) 如果一个类型有一个部分使用了 sealed修饰符,那么整个类都将被视为密封类。
(4) 一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。

6. 局部类型的基类和接口

(1) 一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类,但如果指定,则必须相同。
(2) 局部类型上的接口具有“累加”效应。

partial class Class2: Iinterface1, Iinterface2 {}
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {}


相当于

class Class2: Iinterface1, Iinterface2, Iinterface3 {}

 

 

 

 

 

 

 

 

 

### C# 中 `partial` 关键字的用法和含义 #### 含义 在 C# 中,`partial` 是一个修饰符,主要用于支持 **部分类** 和 **部分方法** 的定义。它允许多个文件中的代码共同组成同一个类或方法,从而提高代码的可维护性和模块化设计能力[^1]。 --- #### 使用场景 1. **分部类 (Partial Classes)** 当一个类的定义非常庞大或者由不同的开发者负责不同功能时,可以将其拆分为多个文件来管理。通过使用 `partial` 关键字,可以在多个源文件中定义同一类的不同部分,在编译时这些部分会被合并成一个完整的类[^2]。 #### 示例代码 ```csharp // 文件1: CustomerPart1.cs public partial class Customer { public string Name { get; set; } } // 文件2: CustomerPart2.cs public partial class Customer { public void PlaceOrder(string order) { Console.WriteLine($"Placing order for {order}"); } } // 主程序 class Program { static void Main() { var customer = new Customer(); customer.Name = "John Doe"; customer.PlaceOrder("Laptop"); } } ``` 上述代码展示了如何将 `Customer` 类分成两个文件分别定义属性和方法,最终它们会合成为一个完整的类实例[^3]。 --- 2. **分部方法 (Partial Methods)** 分部方法允许在一个部分类中声明方法签名,而其具体实现在另一个部分类中完成。如果未提供实现,则编译器会在编译阶段自动移除对该方法的所有调用及其本身,这有助于减少不必要的开销[^1]。 #### 示例代码 ```csharp // 部分 1 public partial class MyClass { partial void OnSomethingHappened(); public void DoSomething() { // 调用部分方法 OnSomethingHappened(); Console.WriteLine("Something is done."); } } // 部分 2 public partial class MyClass { partial void OnSomethingHappened() { Console.WriteLine("Something happened."); } } // 测试代码 class Program { static void Main() { MyClass myClass = new MyClass(); myClass.DoSomething(); // 输出两行文字 } } ``` 如果删除第二部分中对 `OnSomethingHappened()` 方法的实现,运行结果只会显示 `"Something is done."`,因为编译器已经优化掉了无意义的部分方法调用[^1]。 --- #### 注意事项 - 所有带有 `partial` 修饰的部分必须位于相同的命名空间下。 - 定义分部类或分部方法时,各部分之间需保持一致的名字、泛型参数以及访问修饰符等特性。 - 对于分部方法而言,默认情况下它是私有的 (`private`) 并且返回值类型固定为 `void`;因此无法被继承或重写[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值