简单的来说

partial是局部类型的意思
就是说有这个关键字的类、结构或接口可以写成几个部分
比如 public partial class Program
{
static void Main(string[] args)
{
}
} partial class Program
{
public void Test()
{
}
}
编译后它相当于
public class Program
{
static void Main(string[] args)
{
} public void Test()
{
} }

下面作详细的分析:

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

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

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

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

【PartialClassPart1.cs】
using System;
namespace PartialClass
{
    partial class partialClass
    {
        public void Method1()
        {
            Console.WriteLine("PartialClassPart1-partialClass-Method1");
        }
    }
} 【PartialClassPart2.cs】
using System;
namespace PartialClass
{
    partial class partialClass
    {
        public void Method2()
        {
            Console.WriteLine("PartialClassPart2-partialClass-Method2");
        }
    }
} 代码执行类【Program.cs】
using System;
namespace PartialClass
{
    class Program
    {
        static void Main(string[] args)
        {
            partialClass Pc = new partialClass();
            Pc.Method1();
            Pc.Method2();
            Console.ReadKey();
        }
    }
}

结果:

PartialClassPart1-partialClass-Method1

PartialClassPart1-partialClass-Method2

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

//BigClassPart1.cs
[CustomAttribute]
partial class TheBigClass:TheBigBaseClass,IBigClass
{
           public void Method1(){};
}
//BigClassPart2.cs
[AnotherAttribute]
partial class TheBigClass:IOtherBigClass
{
           public void Method2(){};
}
编译后的结果:
[CustomAttribute]
[AnotherAttribute]
partial class TheBigClass:TheBigBaseClass,IBigClass,IOtherBigClass
{
           public void Method1(){};
           public void Method2(){};
}

注意点,总结:

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

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

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

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

public partial class SampleClass
{
  public void MethodA()
  {
  }
}
 
public partial class SampleClass
{
  public void MethodB()
  {
  }
} 和 public class SampleClass
{
  public void MethodA()
  {
  }
  public void MethodB()
  {
  }
} 是等价的。

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

public partial class Sample
...{
public partial class SampleSon
...{
public partial class SampleGrandson
...{
}
}
} public partial class Sample
...{
public partial class SampleSon
...{
public partial class SampleGrandson
...{
}
}
}

最新文章

  1. java.io.NotSerializableException: test.io.file.Student
  2. Python基础2
  3. 【网络编程】Socket概念及简单聊天…
  4. Android系统启动分析(Init->Zygote->SystemServer->Home activity)
  5. 8 Regular Expressions You Should Know
  6. JAVA实现DES加密实现详解
  7. memcache中的add和set方法区别
  8. 算法的上帝——Donald E.Knuth(转)
  9. web快速开发c/s软件构架
  10. OpenGL ES应用开发实践指南:iOS卷
  11. 最大流&最小割 - 专题练习
  12. fuser可以用于系统安全检查。
  13. Nginx反向代理导致PHP获取不到正确的HTTP_HOST,SERVER_NAME,客户端IP的解决方法
  14. 把项目中的那些恶心的无处存储的大块数据都丢到FastDFS之快速搭建
  15. Notepad++中实现Markdown语法高亮与实时预览
  16. avalon加载一闪而过现象
  17. Python:Day42 Position
  18. MySQL准备
  19. Codeforces 1082D Maximum Diameter Graph (贪心构造)
  20. [AWS] OAuth2.0

热门文章

  1. Java连接MySQL简单步骤及常见问题解析
  2. 找不到 cucumber.api.cli.Main 的报错解决方案
  3. SpringBoot中教你手把手配置 https
  4. MAVEN(一) 安装和环境变量配置
  5. [考试反思]0813NOIP模拟测试20
  6. BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(这是我写过最骚气的dp!)
  7. python 爬取猫眼电影top100数据
  8. SysTick系统定时器
  9. linux日志查找方法
  10. egret开发方法(最笨的方法)