首頁 > 軟體

C# 中的partial 關鍵字詳解

2022-07-25 22:02:32

引言

partial 關鍵字用於拆分一個類、一個結構、一個介面或一個方法的定義到兩個或更多的檔案中。 每個原始檔包含型別或方法定義的一部分,編譯應用程式時將把所有部分組合起來。在設計 Framework 時,可以充分利用 partial 這個特性。

分部類

什麼情況下需要拆分類定義呢?

  • 處理大型專案時,使一個類分佈於多個獨立檔案中可以讓多位程式設計師同時對該類進行處理。
  • 當使用自動生成的原始檔時,你可以新增程式碼而不需要重新建立原始檔。 Visual Studio 在建立 Windows 表單、Web 服務包裝器程式碼等時會使用這種方法。 你可以建立使用這些類的程式碼,這樣就不需要修改由 Visual Studio 生成的檔案。
  • 使用源生成器在類中生成附加功能時。

例子

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 有區別是?

  • 概念的區別,this 是對原有功能進行擴充套件,partial 是將整體分成多個部分存放,便於維護。
  • 實現方式的區別

patial 分部的簽名要求一致,必須是 partial class/interface/struct Name,檔名不一樣。
this 擴充套件類名不一樣,但必須是靜態的類,靜態的方法,方法第一個引數必須是 this ClassName

  • 呼叫的區別

partial 分部的各個檔案必須在同一 namespace 名稱空間
this 擴充套件可以在不同名稱空間,但是需要匯入擴充套件的 namespace 名稱空間後才能呼叫擴充套件的方法。

到此這篇關於C# 中的partial 關鍵字的文章就介紹到這了,更多相關C# partial 關鍵字內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com