ホームに戻る
出典 :
部分クラスと部分メソッド - C# | Microsoft Learn partial メソッドの拡張 (C# 9.0 候補機能) | ++C++; // 未確認飛行 C ブログ
関連 :
属性(Attribute) インタフェース
目次 :

partial キーワード

「部分」を表し、クラス、構造体、インタフェース、およびメソッドの定義を複数の箇所に分割して記述できる。 分割された部分型およびメソッドは、コンパイル時に結合される。

部分クラス( partial class )

クラス(など)の定義を分割し、複数のファイルに記述できる。
File1.cs
// 部分クラス定義#1 public partial class Employee { public void DoWork() { : } }
File2.cs
// 部分クラス定義#2 public partial class Employee { public void GoToLunch() { : } }
上記の例では、Employeeクラスを複数のファイルで分割定義している。 分割されたEmployeeの定義はコンパイル時に結合されるため、上記のコードは
public class Employee { public void DoWork() { : } public void GoToLunch() { : } }
と等価である。メソッドに限らず、フィールド、プロパティなどの構成要素はすべて結合される。 このように補機能ごとにファイルを分割して階層化したり、複数人で同時に作業を行う際に有用である。 また、分割クラスにそれぞれ異なる属性を付与したり、それぞれが異なるインタフェースを実装している場合もすべて結合される。 (継承する基底クラスも同様に結合されるが、C#は多重継承が認められていないため、基底クラスが複数になる場合はエラーとなる。)
// Moon の部分定義#1 : SerializableAttribute 付与 [SerializableAttribute] partial class Moon { } // Moon の部分定義#2 : ObsoleteAttribute 付与 [ObsoleteAttribute] partial class Moon { } // 上記が結合された完全な Moon [SerializableAttribute] [ObsoleteAttribute] partial class Moon { } // Earth の部分定義#1 : Planet を継承、IRotate を実装 partial class Earth : Planet, IRotate { } // Earth の部分定義#2 : IRevolve を実装 partial class Earth : IRevolve { } // 上記が結合された完全な Earth class Earth : Planet, IRotate, IRevolve { }

部分型定義における制約

部分メソッド( partial method )

部分クラス、または構造体は部分メソッドを含むことができる。 ある部分クラスでは宣言だけをしておき、別の部分クラスで実装(定義)を行う。
File1.cs
// SampleClass の部分定義#1 partial class SampleClass { // 部分メソッド OnNameChanged() の「宣言」 partial void OnNameChanged(); }
File2.cs
// SampleClass の部分定義#2 partial class SampleClass { // 部分メソッド OnNameChanged() の「定義」 partial void OnNameChanged() { : } }
部分メソッドOnNameChanged()にアクセス指定子が存在しないことに注意。 部分メソッドは既定でprivateとなる。

部分メソッドの特徴

部分メソッドが以下の条件をすべて満たす場合、部分メソッドは実装を省略することができる。 その場合、その部分メソッドおよびそのすべての呼び出し箇所はコンパイル時に削除される。 (実装されていない部分メソッドを呼び出した場合でもエラーとはならない。)
部分メソッドは基底(抽象)クラスで宣言され、派生(具象)クラスで定義される抽象メソッドと一見似ている。 しかし抽象メソッドは具象クラスで必ず実装されなければならず、(条件次第で)実装を省略できる部分メソッドとは異なる。

部分メソッドが使用される局面

テンプレートコードからコードが自動生成される場合、生成されたコード中に部分メソッドが含まれることがある。 この場合、部分メソッドの実装は任意である。