rksoftware

Visual Studio とか C# とかが好きです

C# 9.0 の確認「部分メソッドの新機能」

C# 9.0 の確認の目次はこちら

■ 部分メソッドの新機能

ドキュメントはこちら

コード ジェネレーターのサポート という項目の 3 つ目の塊 「コード ジェネレーターに対して追加された 2 つの機能は」 から始まるブロックです。
~の新機能、という寿葉はそれだけでは具体的な機能がわかりませんが、今回はそれ以前に 部分メソッド を知らないという方も多いのではないでしょうか? 通常自分で書くことはない、知らなくても当たり前の機能だと思うのでまず、部分メソッドのコードを書いてみましょう。

■ 部分メソッド

こんな感じです。

partial class MyClass
{
    partial void MyMethod(int arg);

    public void Main()
    {
        MyMethod(1);
    }
}

partial class MyClass
{
    partial void MyMethod(int arg)
    {
        ;
    }
}

partial class (部分クラス) の中に本体のないメソッドがあります。これが部分メソッドです。本体は部分クラスの別の方で書かれています。
そして重要なのは次のコードがエラーにならないということです。

partial class MyClass
{
    partial void MyMethod(int arg);

    public void Main()
    {
        MyMethod(1);
    }
}

partial class MyClass
{
    // メソッドの本体を書かない
    //partial void MyMethod(int arg)
    //{
    //    ;
    //}
}

部分メソッドでは本体を書かなくてもかまいません。もし本体がない場合はそのメソッドと、メソッド呼び出し (今回であれば MyMethod(1);) はコンパイル時に削除されます。

この機能がどんな時にうれしいかというと、コードが自動生成される場合です。コードの自動生成では 自動生成されたソースファイルにプログラマーが手を加える (コードを書き加える) のは最悪 の手法です。

・自動生成されたコードを書き換えてしまって、再自動生成でコードが失われてしまう ・自動生成したコードを書き換えてしまい動かなくなる

懸念があります。というかそういった事態はかつて起こっていました。皆さんは知らない太古の技術ですが、Windows フォームアプリケーションというものが、かつて存在していました。その技術では画面上のコントロールの定義は画面デザイナーにより自動生成され、自動生成されたソースコードにプログラマーがプログラムを書き足していました。不幸な事故はそう頻繁というわけではありませんが、一切見ないということもないレベルでは起きていたと思います。救世主、部分クラス・部分メソッドによってその懸念が大きく減りました。

■ 部分メソッドの制限

しかし、部分メソッドにはいくつもの制限がありました。private のみ。アクセス修飾子を書くことができない。return 値は void のみ。out 引数は不可。さして厳しい制限ではないですし、本体がなければ消える存在としては打倒な仕様です。

■ 制限解除

C# 9 でこれらの制限が解除されました。 今まで次のコードはエラーでしたが、これからは書けるようになります。

partial class MyClass
{
    private partial int MyMethod(out int arg);

    public void Main()
    {
        var ii = MyMethod(out var i);
    }
}

partial class MyClass
{
    private partial int MyMethod(out int arg)
    {
        arg = 1;
        return 2;
    }
}

■ 注意点

この部分メソッドの新機能を使う構文は先頭に private を書くことです。
C# ではアクセス修飾子がない場合のデフォルトは private ですが、この新機能を使うためには private を明示的に書く必要があります。

■ まとめ

この機能も、書きたくなった時に書いてみたらうまくいった、そういうやつです。しかし、 private と書かないといけない点は覚えておきましょう。でないと書きたくなって書いてみてもダメです。おこられます。
積極的に使いこなす機会は、多くの人にとってはあまりないのかもしれませんが、今期待のコード ジェネレーターを使いこなすためには必要でしょう。しっかり覚えておきましょう。