C# partial 关键字

  • 引言
  • 分部类
  • partial 分部限制
  • 分部接口和结构
  • 分部方法
  • this 和 partial 的区别

引言

partial 关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或更多的文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。在设计 Framework 时,可以充分利用 partial 这个特性。

分部类

什么情况下需要拆分类定义呢?

  1. 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。
  2. 当使用自动生成的源文件时,你可以添加代码而不需要重新创建源文件。 Visual Studio 在创建 Windows 窗体、Web 服务包装器代码等时会使用这种方法。 你可以创建使用这些类的代码,这样就不需要修改由 Visual Studio 生成的文件。
  3. 使用源生成器在类中生成附加功能时。

例子

Coords 类 分部在 2 个文件中定义。

CoordsOne.cs
定义了 Coords 类的构造函数
注意签名 partial class Coords

namespace ConsoleApp1.PartialClass
{public partial class Coords{private int x;private int y;public Coords(int x, int y){this.x = x;this.y = y;}}
}

CoordsTwo.cs
定义了 Coords 类的一个方法
注意签名 partial class Coords

namespace ConsoleApp1.PartialClass
{public partial class Coords{public void PrintCoords(){Console.WriteLine("Coords: {0},{1}", x, y);}}
}

TestPartial.cs
测试一下上面的分部类

using ConsoleApp1.PartialClass;namespace ConsoleApp1
{internal class TestPartial{static void Main(string[] args){Coords coords = new Coords(10, 20);coords.PrintCoords();}}
}

结果:

Coords: 10,20

partial 分部限制

处理分部类定义时需遵循下面的几个规则:

  • 要作为同一类型的各个部分的所有分部类型定义都必须使用 partial 进行修饰。
    例如,下面的类声明会生成错误:
public partial class A { }
//public class A { }  // Error, must also be marked partial
  • partial 修饰符只能出现在紧靠关键字 classstructinterface 前面的位置。

  • 分部类型定义中允许使用嵌套的分部类型,如下面的示例中所示:

partial class ClassWithNestedClass
{partial class NestedClass { }
}partial class ClassWithNestedClass
{partial class NestedClass { }
}
  • 要成为同一类型的各个部分的所有分部类型定义都必须在同一程序集和同一模块(.exe 或 .dll 文件)中进行定义。 分部定义不能跨越多个模块。经测试这些分部的文件必须在同一命名空间
    还是上面的例子,CoordsThree.cs 也定义成 partial 类,但是相比 CoordsOne.csCoordsTwo.cs 不是在同一个命名空间,会出错。

  • 类名和泛型类型参数在所有的分部类型定义中都必须匹配。 泛型类型可以是分部的。 每个分部声明都必须以相同的顺序使用相同的参数名。

  • 如果某关键字出现在一个分部类型定义中,则该关键字不能与在同一类型的其他分部定义中指定的关键字冲突:public,private,protected,internal,abstract,sealed 等
    将 CoordsOne.cs 中 public 改成 internal,产生访问属性冲突。

分部接口和结构

同理,也可以开发分部结构和接口

partial interface ITest
{void Interface_Test();
}partial interface ITest
{void Interface_Test2();
}partial struct S1
{void Struct_Test() { }
}partial struct S1
{void Struct_Test2() { }
}

分部方法

分部方法在分部类型的一部分中定义了签名,并在该类型的另一部分中定义了实现。 通过分部方法,类设计器可提供与事件处理程序类似的方法挂钩,以便开发者决定是否实现。 如果开发者不提供实现,则编译器在编译时删除签名。 以下条件适用于分部方法:

  • 声明必须以上下文关键字 partial 开头。

  • 分部类型各部分中的签名必须匹配。

  • 构造函数、终结器、重载运算符、属性声明或事件声明中不允许使用 partial 关键字。

例如:

namespace PM
{partial class A{partial void OnSomethingHappened(string s);}// This part can be in a separate file.partial class A{// Comment out this method and the program// will still compile.partial void OnSomethingHappened(String s){Console.WriteLine("Something happened: {0}", s);}}
}

在以下情况下,不需要使用分部方法即可实现:

  • 没有任何可访问性修饰符(包括默认的 专用)。
  • 返回 void。
  • 没有任何输出参数。
  • 没有以下任何修饰符:virtual、override、sealed、new 或 extern。

this 和 partial 的区别

C# - this 的用法 一文中有介绍 this 具有扩展类方法的功能,那么 thispartial 有区别是?

  1. 概念的区别,this 是对原有功能进行扩展,partial 是将整体分成多个部分存放,便于维护。
  2. 实现方式的区别
    patial 分部的签名要求一致,必须是 partial class/interface/struct Name,文件名不一样。
    this 扩展类名不一样,但必须是静态的类,静态的方法,方法第一个参数必须是 this ClassName
  3. 调用的区别
    partial 分部的各个文件必须在同一 namespace 命名空间
    this 扩展可以在不同命名空间,但是需要导入扩展的 namespace 命名空间后才能调用扩展的方法。

C# - partial 关键字相关推荐

  1. [partial] C#里partial关键字的作用

    [partial] C#里partial关键字的作用 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. ...

  2. C#玩转指针(二):预处理器、using、partial关键字与region的妙用

    欲练神功,引刀自宫.为了避免内存管理的烦恼,Java咔嚓一下,把指针砍掉了.当年.Net也追随潮流,咔嚓了一下,化名小桂子,登堂入室进了皇宫.康熙往下面一抓:咦?还在?--原来是假太监韦小宝. 打开u ...

  3. 【C#懒蛋编程——5分钟经验分享】02使用partial关键字,分离代码

    因为篇幅很短,所以尝试全文字写法.几分钟看完的文字也没必要用十几分钟写完是吧. C#中的partial关键字,是一个非常有用的东西,尤其是在代码组织方面. 1. 每一个项目都会构建大量的class文件 ...

  4. Partial关键字的使用

    Partial:部分的.此关键字可以对类进行扩展,使其能实现更多的功能 在使用时,需要对进行扩展的类添加Partial关键字. 比如现有一个类Person.cs在A.cs里 public partia ...

  5. C#里partial关键字的作用(转摘)

    1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在 ...

  6. C#里partial关键字的作用

    1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在 ...

  7. C# partial 关键字的使用

    C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文件中实现. (2) ...

  8. C# partial 关键字详解

    我们新建一个Windows Form时,后台代码都会自动添加如下代码: 1 public partial class Form1 : Form 2 { 3     public Form1() 4   ...

  9. partial关键字的含义和使用

    http://blog.csdn.net/zabcd117/archive/2008/01/08/2029987.aspx 转载于:https://www.cnblogs.com/reommmm/ar ...

最新文章

  1. node.js 没有转发_如何用Nodejs编写一个定时消息提醒应用?
  2. 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
  3. ❤️ 爆肝一个月!JAVA零基础入门总结(下)❤️
  4. MySql 错误 Err [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes
  5. CSS布局口诀 - CSS BUG顺口溜
  6. 循迹传感器(TCRT5000)的介绍以及使用(STM32)
  7. webpack的分享
  8. linux 常用命令系列—cp 复制文件与文件夹
  9. java中jsp时间插件_日期插件 - WEB源码|JSP源码/Java|源代码 - 源码中国
  10. 教你正确设置CrossOver的Wine配置(二)
  11. 根据ip地址制作html,根据ip掩码计算可用ip
  12. 40题计算机程序设计基础(C语言)编程习题
  13. SSD固态硬盘检测工具AS SSD参数
  14. 3.IIC总线介绍及使用
  15. Exception in thread main java.lang.NoSuchMethodException: xxx.main([Ljava.lang.String;)
  16. Ubuntu切换桌面显示管理器
  17. lifestyle HTML5酷站欣赏
  18. 笔记 How Powerful are Spectral Graph Neural Networks
  19. Redis在项目中的应用(点评)
  20. android仿微信发送位置,Android仿微信发送位置-百度地图

热门文章

  1. UDP服务器判断客户端是否掉线
  2. 北漂程序员的爱情故事
  3. java 多个throw_Java throw和throws 关键字
  4. Gamma值越大,图像越暗
  5. python数值运算实例_“每天进步一点点”案例学习python数值操作
  6. java 打印gc_输出Java的GC信息
  7. DLT645-2007电表协议解析
  8. Linux虚拟主机配置终极篇
  9. dwr java_DWR学习及应用
  10. makefile脚本