2022年02月01日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説! total 1441 count

partial: partialクラスとpartialメソッドは似ているが違う

Written By: 川俣 晶連絡先

この章のテーマ §

 partialクラス(partial型)とpartialメソッドについて学びます。これらは定義を分割する手段ですが、機能的には全く違う効能を持ちます。

前提知識 §

Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, クラスの基礎、メソッドの基礎

解説 §

 partialキーワードを付けたクラスなどの型は、定義を複数に分割できます。つまり、同じ名前のクラスの定義が複数あっても良く、それらは全て足し合わさされて1つの定義として扱われます。つまり、privateとして宣言されたメソッドは、サンプルソースのように、他の定義からでも呼び出せます。

 一方で、partialキーワードを付けたメソッドはpartialメソッドとなり、定義の分割とは違う効能を発揮します。名前、戻り値の型、引数の宣言だけを書いた部分と、実行する文まで記述した完全な形の実装の2つを分けて記述できますが、実装は省略できます。実装がないとしても呼び出しを行うコードは記述可能で実行できます。ただ単に何も呼び出さないだけです。これはツールで自動生成したコードに、必要な実装だけ主導で追加する場合に便利な機能です。

罠の数々 §

  • partialクラス(partial型)は単に定義を分割可能にしているだけで、最終的に全て1つの型になる。同じ名前の別の型を宣言しているわけではない
  • partualクラスは割と古い機能で、WinFormアプリを開発するとすぐにでも目にする可能性がある
  • 一方で、partialメソッドはかなり新しい機能なので、利用例はなかなか見かけない。しかし、今後は活用されていくかもしれない。頭の片隅に入れておこう

参考リンク §

partial 型 (C# リファレンス)

partial メソッド (C# リファレンス)

部分クラスと部分メソッド (C# プログラミング ガイド)

サンプルソース: kw_partial §

var x = new A();

x.PublicSub();

partial class A

{

    private void privateSub()

    {

        Console.WriteLine("A.privateSub");

    }

    partial void PartialMethodA();

    partial void PartialMethodB();

}

partial class A

{

    public void PublicSub()

    {

        Console.WriteLine("A.PublicSub");

        privateSub();

        PartialMethodA();

        PartialMethodB();

    }

    partial void PartialMethodA()

    {

        Console.WriteLine("A.PartialMethodA");

    }

}

実行結果 §

A.PublicSub

A.privateSub

A.PartialMethodA

リポジトリ §

https://github.com/autumn009/CSharpPrimer2

練習問題 §

 以下のプログラムの実行結果を予測してみよう。

var x = new A();

Console.WriteLine(x.PartialMethodA());

partial class A

{

    public partial int PartialMethodA();

}

  1. 0
  2. null
  3. default
  4. コンパイルエラー
  5. 実行時例外

[[解答]]

単行本情報