🍭

partialプロパティをMVVM Toolkitで遊ぶ

2024/11/14に公開

参考

環境

  • Visual Studio 2022 - 17.12.0
  • .NET 9
  • C# 13
  • CommunityToolkit.Mvvm 8.4.0-preview1

コード

遊んだコードは以下に置きました。

https://github.com/tnagata012/Sample-CommToolMauiApp

partialプロパティ

C# 13の新機能として、partialプロパティが追加されました。これにより、partialクラス間でプロパティの宣言と実装を分けて記述できるようになります。宣言部分は自動実装プロパティのように見えますが、言語機能としてはインターフェースのような役割を果たします。

public partial class C
{
    // Declaring declaration
    public partial string Text { get; set; }
}

public partial class C
{
    // implementation declaration:
    private string _text;
    public partial string Text
    {
        get => _text;
        set => _text = value;
    }
}

利用目的

オブジェクト指向の観点から見ると、この機能の利点はよくわかりません。この機能はMVVM ToolkitのようなSource Generatorを使っているフレームワークで真価を発揮します。生成対象がプロパティまで拡張されるのです。

本機能は言語的にはインターフェースのようなものだと触れましたが、Source Generatorのもとでは、スーパー自動実装プロパティになります(?)。

使ってみる

MAUIのView Modelで実際に使ってみます。partialプロパティを宣言部を記述します。今まではフィールドと自動生成で変数の名称が異なっていたため、これで存在する変数名を単純に1/2にできます。

[ObservableProperty]
public partial string Text { get; set; }

MVVM ToolKit環境では、以下が自動生成されます。ありがたや。

[global::System.CodeDom.Compiler.GeneratedCode("CommunityToolkit.Mvvm.SourceGenerators.ObservablePropertyGenerator", "8.4.0.0")]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public partial string Text
{
    get => field;
    set
    {
        if (!global::System.Collections.Generic.EqualityComparer<string>.Default.Equals(field, value))
        {
            OnTextChanging(value);
            OnTextChanging(default, value);
            OnPropertyChanging(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs.Text);
            field = value;
            OnTextChanged(value);
            OnTextChanged(default, value);
            OnPropertyChanged(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs.Text);
        }
    }
}

[おまけ] XAMLから一発でViewModelへ移動

変数の数が少なくなる事の他にも少し嬉しいことがあります。今まではXAMLから定義へ移動しようとすると自動生成コードに移っていましたが、自分のViewModelのコードに一発でたどり着けます。

Move to Declaration

🐟️まとめ

私はC#の言語リリースノートを見ただけだと、正直何に使うのかよくわかりませんでした。しかし、実際に遊んでみるとスーパーな使用感に嬉しくなりました。

Discussion