非 null 許容参照型のプロパティに !
付けて null 値突っ込むのはどうなんですか!?
以前にこんな記事を書きました。
つまり、Blazor における Razor コンポーネント実装において、依存オブジェクトを DI コンテナからプロパティ注入してもらう際、その実装を .razor ファイルで @inject
ディレクティブで書くぶんには、まぁ、問題ないのですが (下記例)、
@inject IFooService Foo
諸事情でコードビハインド (*.razor.cs) 側でその実装を書く場合、前述の記事のとおり、null 許容参照型のあれこれの関係で以下のように書いている、という話でした。
...
[Inject]
public IFooService Foo { get; init; } = default!;
これの何が不満かというと、非 null 許容参照型のプロパティに、「!」付けて無理矢理 null 値を突っ込んでいる、そうやってコンパイラを黙らせているという点ですね。
機能的・実用的には、まぁ、どうやら大丈夫そうなんですけど、でもまったくもって美しくないです。それに、「!」付きで無理くり null 値突っ込むのは、DI コンテナからの依存オブジェクト注入先のプロパティだからかろうじて許容できるのであって (もしも依存性解決に失敗してこのプロパティにオブジェクトを設定できない場合は、そもそもこの Razor コンポーネントが有効化されないので)、ですが、この実装を見て、他のやってはいけない箇所で ... = default!;
みたいな実装をマネされるのもちょっと怖いです。
それ、C# 11 でスッキリできるよ!
そんなモヤモヤした、Razor コンポーネントのコードビハインドにおけるプロパティ注入実装でしたが、なんと、2022年11月にリリースされた C# 11 で新たに追加された修飾子構文 required
を使うことで、そんなモヤモヤから解放されます!
今後は下記のように required
修飾子を付けて書けば OK です!
...
[Inject]
public required IFooService Foo { get; init; }
required
修飾子についてより詳しくは、@ufcpp さんの下記ページなどがわかりやすいかと思います。
以上、Happy Coding!