ひでぼ~blog

C#ときどきゲーム

null許容参照型を試した

なんとなく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非許容の参照型の場合、初期化が必要になるようです。 f:id:hideb3:20200218000007p:plain

次にメソッドを作ってみます。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のようにプロパティを参照しようとすると

f:id:hideb3:20200217234526p:plain

nullじゃないからnullチェックは不要と教えてくれました。 逆にnull許容版ではnullチェックをしないと、nullの可能性があると言われました。 f:id:hideb3:20200217235121p:plain

ざっくりと試してみましたがプロジェクト全体でnull許容参照型を有効にすると影響がデカい感じがしました。とはいえ部分的に参照型のnullチェックが不要な世界があると助かるなーと思いました。 今回のサンプルでは使いませんでしたが'#nullable enable'という書き方をするとコード内で部分的に有効にすることができるようです。