ホームに戻る
出典 :
関連 :
目次 :
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
となる。
部分メソッドの特徴
部分メソッドが以下の条件をすべて満たす場合、部分メソッドは実装を省略することができる。
その場合、その部分メソッドおよびそのすべての呼び出し箇所はコンパイル時に削除される。
(実装されていない部分メソッドを呼び出した場合でもエラーとはならない。)
- 宣言にアクセス修飾子を含まない。この場合のアクセス権は
private
となる。
- 戻り値が無い(
void
)。
out
修飾された引数が無い。
- 以下の修飾が無い。
virtual
override
sealed
new
extern
部分メソッドは基底(抽象)クラスで宣言され、派生(具象)クラスで定義される抽象メソッドと一見似ている。
しかし抽象メソッドは具象クラスで必ず実装されなければならず、(条件次第で)実装を省略できる部分メソッドとは異なる。
部分メソッドが使用される局面
テンプレートコードからコードが自動生成される場合、生成されたコード中に部分メソッドが含まれることがある。
この場合、部分メソッドの実装は任意である。