一、partial

它是一个关键字修饰符。可以将类或结构、接口或方法的定义拆分到两个或更多个源文件中。 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。修饰符不可用于委托或枚举声明中。

二、分部类

在以下几种情况下需要拆分类定义:

处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理。

使用自动生成的源时,无需重新创建源文件便可将代码添加到类中。 Visual Studio 在创建 Windows 窗体、Web 服务包装器代码等时都使用此方法。 无需修改 Visual Studio 创建的文件,就可创建使用这些类的代码。

简单示例

public partial classTest

{public int Id { get; set; }public string Name { get; set; }public voidShowAge()

{

Console.WriteLine($"My age is {this.Age}");

}

}public partial classTest

{public string Age { get; set; }public voidShowNewAge()

{

ChangeAge();

Console.WriteLine($"My new age is {this.Age}");

}private voidChangeAge()

{this.Age = "20";

}

}classProgram

{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 classTestBase { }public interfaceITest

{voidShowAge();

}

[SerializableAttribute]public partial classTest: TestBase

{public int Id { get; set; }public string Name { get; set; }public voidShowAge()

{

Console.WriteLine($"My age is {this.Age}");

}

}

[ObsoleteAttribute]public partial classTest: ITest

{public string Age { get; set; }public voidShowNewAge()

{

ChangeAge();

Console.WriteLine($"My new age is {this.Age}");

}private voidChangeAge()

{this.Age = "20";

}

}

它们等效于:

[SerializableAttribute]

[ObsoleteAttribute]public classTest : TestBase,ITest

{//...

}

如果将任意部分声明为抽象的,则整个类型都被视为抽象的。 如果将任意部分声明为密封的,则整个类型都被视为密封的。

//抽象类示例

public partial classPTest {}public abstract partial classPTest { }classProgram

{static void Main(string[] args)

{//PTest PTest = new PTest();//提示:无法创建抽象类或接口"PTest"的实例

}

}//密封类示例

public partial classSTest { }public sealed partial classSTest { }//public class SubTest: STest { }

三、分部方法

分部类或结构可以包含分部方法。 类的一个部分包含方法的签名。 分部方法声明由两个部分组成:定义和实现。

但是它的限制很多,只能在部分场景下使用。

分部方法声明必须以上下文关键字 partial 开头,并且方法必须返回 void。

分部方法可以有 ref 参数,但不能有 out 参数。

分部方法为隐式 private 方法,因此不能为 virtual 方法。

分部方法不能为 extern 方法,因为主体的存在确定了方法是在定义还是在实现。

分部方法可以有 static 和 unsafe 修饰符。

分部方法可以是泛型的。 约束将放在定义分部方法声明上,但也可以选择重复放在实现声明上。 参数和类型参数名称在实现声明和定义声明中不必相同。

你可以为已定义并实现的分部方法生成委托,但不能为已经定义但未实现的分部方法生成委托。

参考:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods

http://www.cnblogs.com/OpenCoder/archive/2009/10/27/1590328.html

C 语言的分部类和分部方法,c# partial 分部类和分部方法相关推荐

  1. partial 分部类-庞大类的瘦身计划

    文章目录 使用情况 语法 博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 一般来说,一个类.结构或者接口位于一个源文件中,但是某些情况,比如大型项目.特殊部署时,可能需要把一个类. ...

  2. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  3. Java程序中AB类可调用_19年【石油大学】《Java语言程序设计》二次在线作业(100分)...

    试卷总分:100    得分:100 第1题,1.(2.5分)对象使用时,下面描述错误的是 A.通过"."运算符调用成员变量和方法 B.通过成员变量的访问权限设定限制自身对这些变量 ...

  4. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)...

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  5. 2022 CCF形式化方法工业应用前沿分论坛暨中科国创高可信联合上海控安新品发布会顺利召开!...

    11月27日,2022年CCF中国软件大会"形式化方法工业应用前沿"技术分论坛暨中科国创高可信联合上海控安新品发布会于线上顺利召开.本次活动由CCF形式化方法专业委员会主办,华东师 ...

  6. java box类定义三变量_01.类的成员变量:\n设计一个立方体类Box,定义三个属性,分别是长,宽,高。定义二个方法,分别计...

    01.类的成员变量:\n设计一个立方体类Box,定义三个属性,分别是长,宽,高.定义二个方法,分别计算并输出立方体的体积和表面积 答:java.util.Scanner; public class B ...

  7. JAVA语言五猴分桃简单解法_五猴分桃问题新解及其联想

    了,它不知道有1个同伴已经来过,还以为自己第1个到的呢,于是将地上的桃子堆起来,平均分成5份,发现也多了1个,同样吃了这1个,拿走其中的1堆.第3只.第4只.第5只猴子都是这样--问这5只猴子至少摘了 ...

  8. 多位点序列分型_细菌多位点序列分型(Multilocus sequence typing,MLST)的原理及分型方法...

    摘 要: 多位点序列分型(MLST)是一种基于核酸序列测定的细菌分型方法,通过PCR扩增多个管家基因内部片段,测定其序列,分析菌株的变异,从而进行分型.MLST被广泛应用于病原菌.环境菌和真核生物中. ...

  9. R语言ggplot2可视化分面图(faceting):自定义分面图可视化、ggplot2可视化分面图并移除分面图之间的边框线条(Remove Panel Border Lines in a facet

    R语言ggplot2可视化分面图(faceting):自定义分面图可视化.ggplot2可视化分面图并移除分面图之间的边框线条(Remove Panel Border Lines in a facet ...

最新文章

  1. return、break、continue区别以及作用范围
  2. java 75-76
  3. java的开源项目哪里找,我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)...
  4. 如何卸载linux中的docker,linux centos7 安装、卸载docker
  5. 遮掩java_css之图片下方定位遮掩层
  6. mapgis中6.7属性结构_不知道如何组织项目结构,这个项目也许可以给你启发
  7. SIP中第三方呼叫控制(3PCC)建立流程
  8. Android项目目录结构中各个文件夹的作用
  9. (day 10 - 双指针)剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
  10. Netty-Pipeline组件
  11. 数据库系统概论第五版课后习题答案王珊
  12. c语言 ipv4转ipv6,环境配置:Ipv6转Ipv4
  13. 警方通报“济南1家6口死亡”案:男子杀害亲人后放火跳楼
  14. 微风:AI新手入门学习教程
  15. 笔记本onenote绘画快捷键_OneNote 超全快捷键
  16. 评分模型的检验方法和标准信用评分及实现
  17. 车站安防巡逻机器人未来发展趋势是什么?
  18. Python3群聊聊天室
  19. for循环遍历字符串
  20. Oracle EBS R12 AP模块主要表结构整理

热门文章

  1. c语言初始化列表,Initialization(初始化)
  2. 朴素贝叶斯(naive bayes)分类
  3. Android Studio方法红色的解决办法
  4. 字符串拼接的4种常用方法
  5. 一文详解语义SLAM相关工作
  6. python中文词频排序_Python中文词频统计
  7. 霍金:哥德尔和物理学的终结
  8. 使用163邮箱的朋友请换个邮箱地址给我写信
  9. HotDB Server 开放下载先知篇--常用名词解释
  10. IntelliJ IDEA 注册码