なんとなくC#8のnull許容参照型を試したくなったのでコードを書いてみました。 手っ取り早く試したいのでcsprojを編集してプロジェクト丸ごとnull許容参照型を有効にしました。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <Nullable>enable</Nullable> </PropertyGroup> </Project>
いつもどおり適当なクラスを作ってみたのですが、string型のプロパティをnull許容参照型に変更するよう促す警告がでました。 ?を付けないnull非許容の参照型の場合、初期化が必要になるようです。
次にメソッドを作ってみます。Bookクラスのオブジェクトをコンソールに表示するHelperクラスを作りました。null許容版とnull非許容版のShowBookDetailメソッドを作ります。
public static class ConsoleHelper { // Null非許容 public static void ShowBookDetail(Book book) { Console.WriteLine("********Book Detail********"); Console.WriteLine($"{nameof(book.Name)}: {book.Name}"); Console.WriteLine($"{nameof(book.Authors)}: {string.Join(", ", book.Authors)}"); Console.WriteLine("***************************"); } // Null許容 public static void ShowNullableBookDetail(Book? book) { if (book == null) { return; } Console.WriteLine("********Book Detail********"); Console.WriteLine($"{nameof(book.Name)}: {book.Name}"); Console.WriteLine($"{nameof(book.Authors)}: {string.Join(", ", book.Authors)}"); Console.WriteLine("***************************"); } }
null非許容版では引数のbookはnullでないことが保証されるため、book?.Nameのようにプロパティを参照しようとすると
nullじゃないからnullチェックは不要と教えてくれました。 逆にnull許容版ではnullチェックをしないと、nullの可能性があると言われました。
ざっくりと試してみましたがプロジェクト全体でnull許容参照型を有効にすると影響がデカい感じがしました。とはいえ部分的に参照型のnullチェックが不要な世界があると助かるなーと思いました。 今回のサンプルでは使いませんでしたが'#nullable enable'という書き方をするとコード内で部分的に有効にすることができるようです。