简单的来说

  1. partial是局部类型的意思
  2. 就是说有这个关键字的类、结构或接口可以写成几个部分
  3. 比如 public partial class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. }
  8. }
  9.  
  10. partial class Program
  11. {
  12. public void Test()
  13. {
  14. }
  15. }
  16. 编译后它相当于
  17. public class Program
  18. {
  19. static void Main(string[] args)
  20. {
  21. }
  22.  
  23. public void Test()
  24. {
  25. }
  26.  
  27. }

下面作详细的分析:

partial关键字允许把类、结构或接口放在多个文件中。一般情况下,一个类存储在单个文件中。但有时,多个开发人员需要访问同一个类,或者某种类型的代码生成器生成了一个类的某部分,所以把类放在多个文件中是有益的。

partial关键字的用法是:把partial关键字放在class,struct或interface关键字前面。

我在下面用几个例子作说明:

含有三个类文件:PartialClassPart1.cs,PartialClassPart2.cs,Program.cs,两个部分类分别置于前面两个类文件中,各有一个方法。

  1. PartialClassPart1.cs
  2. using System;
  3. namespace PartialClass
  4. {
  5.     partial class partialClass
  6.     {
  7.         public void Method1()
  8.         {
  9.             Console.WriteLine("PartialClassPart1-partialClass-Method1");
  10.         }
  11.     }
  12. }
  13.  
  14.  
  15. PartialClassPart2.cs
  16. using System;
  17. namespace PartialClass
  18. {
  19.     partial class partialClass
  20.     {
  21.         public void Method2()
  22.         {
  23.             Console.WriteLine("PartialClassPart2-partialClass-Method2");
  24.         }
  25.     }
  26. }
  27.  
  28.  
  29. 代码执行类【Program.cs
  30. using System;
  31. namespace PartialClass
  32. {
  33.     class Program
  34.     {
  35.         static void Main(string[] args)
  36.         {
  37.             partialClass Pc = new partialClass();
  38.             Pc.Method1();
  39.             Pc.Method2();
  40.             Console.ReadKey();
  41.         }
  42.     }
  43. }

结果:

PartialClassPart1-partialClass-Method1

PartialClassPart1-partialClass-Method2

当然:这两个method的名字不能一样!

  1. //BigClassPart1.cs
  2. [CustomAttribute]
  3. partial class TheBigClass:TheBigBaseClass,IBigClass
  4. {
  5.            public void Method1(){};
  6. }
  7. //BigClassPart2.cs
  8. [AnotherAttribute]
  9. partial class TheBigClass:IOtherBigClass
  10. {
  11.            public void Method2(){};
  12. }
  1. 编译后的结果:
  2. [CustomAttribute]
  3. [AnotherAttribute]
  4. partial class TheBigClass:TheBigBaseClass,IBigClass,IOtherBigClass
  5. {
  6.            public void Method1(){};
  7.            public void Method2(){};
  8. }

注意点,总结:

如果声明类使用了下面的关键字,这些关键字将应用于同一个类的所有部分:

public,private,protected,internal,abstract,sealed,new ,一般约束。

在嵌套的类型中,只要partial关键字位于class关键字的前面,就可以嵌套不分类。在把部分类编译到类型中时,会合并属性,XML注释,接口,泛型类型的参数属性和成员。

partial 关键字的作用是将你的 class 分为多个部分,编译器会将多个部分拼到一起去。

  1. public partial class SampleClass
  2. {
  3.   public void MethodA()
  4.   {
  5.   }
  6. }
  7.  
  8. public partial class SampleClass
  9. {
  10.   public void MethodB()
  11.   {
  12.   }
  13. }
  14.  
  15.  
  16. public class SampleClass
  17. {
  18.   public void MethodA()
  19.   {
  20.   }
  21.   public void MethodB()
  22.   {
  23.   }
  24. }
  25.  
  26. 是等价的。

我猜想这个东西出现的初衷是为了解决掉:“窗体设计器生成的代码”这个令人讨厌的 region。 对我们来说,在团队开发当中这个东西或许也会有点用处。 我观察了一下生成的 IL 代码,使用 partial 生成的代码并没有什么特殊的标记,这说明 partial 纯粹是语言的特性,CLR 完全不知道这么个玩意的存在,这也就意味着不要指望将 partial class 编译为 assembly 或者 module 什么的再与其他的人写的 partial class 去进行拼接:它只能在编译的时候起作用。 为了考验一下编译器,我试着让某一个 partial class 不显式指定父类,发现代码仍然能够正确的通过编译,编译器会按照某一个显式指定了父类的 partial 进行编译,只有在多个 partial 指定了不同父类时才会报错。同样,如果多个 partial 指定了自相矛盾的修饰符的话,编译时也会报错的。 有意思的是,我们还可以写以下这样的代码:

  1. public partial class Sample
  2. ...{
  3. public partial class SampleSon
  4. ...{
  5. public partial class SampleGrandson
  6. ...{
  7. }
  8. }
  9. }
  10.  
  11. public partial class Sample
  12. ...{
  13. public partial class SampleSon
  14. ...{
  15. public partial class SampleGrandson
  16. ...{
  17. }
  18. }
  19. }

C# partial 关键字分析的更多相关文章

  1. c#中的partial关键字(转)

    c#中的partial关键字 Partial:      这是C#2.0的新特性 Partial关键字起到把一个class分段组合作用,能用于多个接口或一个继承 代码片断: namespace Com ...

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

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

  3. 高性能mysql-----MySQL_explain关键字分析查询语句(一)

    转载地址:https://www.cnblogs.com/xpp142857/p/7373005.html   MySQL_explain关键字分析查询语句 通过对查询语句的分析,可以了解查询语句的执 ...

  4. C# partial 关键字

    C# partial关键字详解 partial关键字允许把类.结构或接口放在多个文件中.一般情况下,一个类存储在单个文件中.但有时,多个开发人员需要访问同一个类,或者某种类型的代码生成器生成了一个类的 ...

  5. C#中的partial关键字

    这节讲一下partial(局部的,部分的)关键字,初学者可能没有接触过这个关键字,但是只要你写过winform或者WPF应用程序的话,那你肯定被动用过这个关键字.首先介绍一下这个关键字的作用,它用作定 ...

  6. C#中partial关键字

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

  7. c#中Partial关键字的作用

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

  8. Java基础(二)-static关键字分析

    static关键字是我们在编程中经常会使用到的,但有些可能只知其然而不知其所以然.下面介绍static关键字的作用再通过例子结合说明. static关键字共有五种作用(先说明static所修饰的不会改 ...

  9. c# partial 关键字的使用

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

随机推荐

  1. 前端开发之VSCode扩展

    1.Chinese (Simplified) Language Pack for Visual Studio Code——中文语言包 2.Beautify——代码格式化工具 3.HTML Snippe ...

  2. Node.js 使用 express-jwt 解析 JWT

    Node.js 上 Token 鉴权常用的是 passport,它可以自定义校验策略,但如果你是用 express 框架,又只是解析 JWT 这种简单需求,可以尝试下 express-jwt 这个中间 ...

  3. redis 基本类型和命令(一)

    一.Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). (1) string类型是Redis最基本的数 ...

  4. python学习之【第九篇】:Python中的变量作用域

    1.前言 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 2.变量作用域 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作 ...

  5. NOIP模拟赛18 皇帝的烦恼O(∩_∩)O 二分+DP

    题目描述 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职.拒绝接受皇帝的圣旨. 秦皇已经准备好 ...

  6. Spring Cloud gateway 六 Sentinel nacos存储动态刷新

    微服务当前这么火爆的程度,如果不能学会一种微服务框架技术.怎么能升职加薪,增加简历的筹码?spring cloud 和 Dubbo 需要单独学习.说没有时间?没有精力?要学俩个框架?而Spring C ...

  7. 『题解』LibreOJ6277 数列分块入门 1

    更好的阅读体验 Portal Portal1: LibreOJ Description 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间加法,单点查值. Input 第一行输入一个数字 ...

  8. Java基础系列5:深入理解Java异常体系

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 前言: Java的基 ...

  9. 003.Kubernetes二进制部署准备

    一 前置准备 1.1 前置条件 相应的充足资源的Linux服务器: 设置相应的主机名,参考命令: hostnamectl set-hostname k8smaster Mac及UUID唯一: 若未关闭 ...

  10. javascript腾讯地图放到网页中的方法

    1 输入地址获取经纬度 http://lbs.qq.com/tool/getpoint/2 修改url https://apis.map.qq.com/uri/v1/marker?marker=coo ...