4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BlazorAdvent Calendar 2022

Day 6

Blazor のコードビハインドでの依存性注入時、CS8618 警告対策の default! が C# 11 で不要に!

Last updated at Posted at 2022-12-06

非 null 許容参照型のプロパティに ! 付けて null 値突っ込むのはどうなんですか!?

以前にこんな記事を書きました。

つまり、Blazor における Razor コンポーネント実装において、依存オブジェクトを DI コンテナからプロパティ注入してもらう際、その実装を .razor ファイルで @inject ディレクティブで書くぶんには、まぁ、問題ないのですが (下記例)、

*.razor
@inject IFooService Foo

諸事情でコードビハインド (*.razor.cs) 側でその実装を書く場合、前述の記事のとおり、null 許容参照型のあれこれの関係で以下のように書いている、という話でした。

*.razor.cs
...
[Inject]
public IFooService Foo { get; init; } = default!;

これの何が不満かというと、非 null 許容参照型のプロパティに、「!」付けて無理矢理 null 値を突っ込んでいる、そうやってコンパイラを黙らせているという点ですね。

機能的・実用的には、まぁ、どうやら大丈夫そうなんですけど、でもまったくもって美しくないです。それに、「!」付きで無理くり null 値突っ込むのは、DI コンテナからの依存オブジェクト注入先のプロパティだからかろうじて許容できるのであって (もしも依存性解決に失敗してこのプロパティにオブジェクトを設定できない場合は、そもそもこの Razor コンポーネントが有効化されないので)、ですが、この実装を見て、他のやってはいけない箇所で ... = default!; みたいな実装をマネされるのもちょっと怖いです。

それ、C# 11 でスッキリできるよ!

そんなモヤモヤした、Razor コンポーネントのコードビハインドにおけるプロパティ注入実装でしたが、なんと、2022年11月にリリースされた C# 11 で新たに追加された修飾子構文 required を使うことで、そんなモヤモヤから解放されます!

今後は下記のように required 修飾子を付けて書けば OK です!

*.razor.cs
...
[Inject]
public required IFooService Foo { get; init; }

required 修飾子についてより詳しくは、@ufcpp さんの下記ページなどがわかりやすいかと思います。

以上、Happy Coding!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?