網(wǎng)站首頁(yè) 編程語言 正文
引言
partial
關(guān)鍵字用于拆分一個(gè)類、一個(gè)結(jié)構(gòu)、一個(gè)接口或一個(gè)方法的定義到兩個(gè)或更多的文件中。 每個(gè)源文件包含類型或方法定義的一部分,編譯應(yīng)用程序時(shí)將把所有部分組合起來。在設(shè)計(jì) Framework 時(shí),可以充分利用 partial
這個(gè)特性。
分部類
什么情況下需要拆分類定義呢?
- 處理大型項(xiàng)目時(shí),使一個(gè)類分布于多個(gè)獨(dú)立文件中可以讓多位程序員同時(shí)對(duì)該類進(jìn)行處理。
- 當(dāng)使用自動(dòng)生成的源文件時(shí),你可以添加代碼而不需要重新創(chuàng)建源文件。 Visual Studio 在創(chuàng)建 Windows 窗體、Web 服務(wù)包裝器代碼等時(shí)會(huì)使用這種方法。 你可以創(chuàng)建使用這些類的代碼,這樣就不需要修改由 Visual Studio 生成的文件。
- 使用源生成器在類中生成附加功能時(shí)。
例子
將 Coords 類 分部在 2 個(gè)文件中定義。
CoordsOne.cs
定義了 Coords 類的構(gòu)造函數(shù)
注意簽名 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 類的一個(gè)方法
注意簽名 partial class Coords
namespace ConsoleApp1.PartialClass { public partial class Coords { public void PrintCoords() { Console.WriteLine("Coords: {0},{1}", x, y); } } }
TestPartial.cs
測(cè)試一下上面的分部類
using ConsoleApp1.PartialClass; namespace ConsoleApp1 { internal class TestPartial { static void Main(string[] args) { Coords coords = new Coords(10, 20); coords.PrintCoords(); } } }
結(jié)果:
Coords: 10,20
partial 分部限制
處理分部類定義時(shí)需遵循下面的幾個(gè)規(guī)則:
- 要作為同一類型的各個(gè)部分的所有分部類型定義都必須使用
partial
進(jìn)行修飾。
例如,下面的類聲明會(huì)生成錯(cuò)誤:
public partial class A { } //public class A { } // Error, must also be marked partial
-
partial
修飾符只能出現(xiàn)在緊靠關(guān)鍵字class
、struct
或interface
前面的位置。 - 分部類型定義中允許使用嵌套的分部類型,如下面的示例中所示:
partial class ClassWithNestedClass { partial class NestedClass { } } partial class ClassWithNestedClass { partial class NestedClass { } }
要成為同一類型的各個(gè)部分的所有分部類型定義都必須在同一程序集和同一模塊(.exe 或 .dll 文件)中進(jìn)行定義。 分部定義不能跨越多個(gè)模塊。經(jīng)測(cè)試這些分部的文件必須在同一命名空間
。
還是上面的例子,CoordsThree.cs 也定義成 partial
類,但是相比 CoordsOne.cs 和 CoordsTwo.cs 不是在同一個(gè)命名空間,會(huì)出錯(cuò)。
- 類名和泛型類型參數(shù)在所有的分部類型定義中都必須匹配。 泛型類型可以是分部的。 每個(gè)分部聲明都必須以相同的順序使用相同的參數(shù)名。
- 如果某關(guān)鍵字出現(xiàn)在一個(gè)分部類型定義中,則該關(guān)鍵字不能與在同一類型的其他分部定義中指定的關(guān)鍵字沖突:public,private,protected,internal,abstract,sealed 等
將 CoordsOne.cs 中 public 改成 internal,產(chǎn)生訪問屬性沖突。
分部接口和結(jié)構(gòu)
同理,也可以開發(fā)分部結(jié)構(gòu)和接口
partial interface ITest { void Interface_Test(); } partial interface ITest { void Interface_Test2(); } partial struct S1 { void Struct_Test() { } } partial struct S1 { void Struct_Test2() { } }
分部方法
分部方法在分部類型的一部分中定義了簽名,并在該類型的另一部分中定義了實(shí)現(xiàn)。 通過分部方法,類設(shè)計(jì)器可提供與事件處理程序類似的方法掛鉤,以便開發(fā)者決定是否實(shí)現(xiàn)。 如果開發(fā)者不提供實(shí)現(xiàn),則編譯器在編譯時(shí)刪除簽名。 以下條件適用于分部方法:
- 聲明必須以上下文關(guān)鍵字
partial
開頭。 - 分部類型各部分中的簽名必須匹配。
- 構(gòu)造函數(shù)、終結(jié)器、重載運(yùn)算符、屬性聲明或事件聲明中不允許使用
partial
關(guān)鍵字。
例如:
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); } } }
在以下情況下,不需要使用分部方法即可實(shí)現(xiàn):
- 沒有任何可訪問性修飾符(包括默認(rèn)的 專用)。
- 返回 void。
- 沒有任何輸出參數(shù)。
- 沒有以下任何修飾符:virtual、override、sealed、new 或 extern。
this 和 partial 的區(qū)別
C# - this 的用法 一文中有介紹 this 具有擴(kuò)展類方法的功能,那么 this
和 partial
有區(qū)別是?
- 概念的區(qū)別,
this
是對(duì)原有功能進(jìn)行擴(kuò)展,partial
是將整體分成多個(gè)部分存放,便于維護(hù)。 - 實(shí)現(xiàn)方式的區(qū)別
patial
分部的簽名要求一致,必須是 partial
class/interface/struct Name,文件名不一樣。
this 擴(kuò)展類名不一樣,但必須是靜態(tài)的類,靜態(tài)的方法,方法第一個(gè)參數(shù)必須是 this
ClassName
- 調(diào)用的區(qū)別
partial
分部的各個(gè)文件必須在同一 namespace 命名空間this
擴(kuò)展可以在不同命名空間,但是需要導(dǎo)入擴(kuò)展的 namespace 命名空間后才能調(diào)用擴(kuò)展的方法。
原文鏈接:https://blog.csdn.net/wumingxiaoyao/article/details/125945881
相關(guān)推薦
- 2022-06-10 redis?解決庫(kù)存并發(fā)問題實(shí)現(xiàn)數(shù)量控制_Redis
- 2022-11-15 python管理包路徑之pycharm自動(dòng)解決包路徑注冊(cè)_python
- 2022-05-23 iOS?Segment帶滑動(dòng)條切換效果_IOS
- 2022-07-03 Qt5實(shí)現(xiàn)qDebug日志信息寫入日志文件過程_C 語言
- 2023-02-15 C++在vscode中的多文件編程問題解讀_C 語言
- 2022-08-06 python實(shí)現(xiàn)去除空格及tab換行符的方法_python
- 2022-04-11 圖文詳解C#中的協(xié)變與逆變_C#教程
- 2022-08-16 C++超詳細(xì)梳理基礎(chǔ)知識(shí)_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支