【オブジェクト指向設計】null許容型の使いどき

本記事では、オブジェクト指向設計においてnull許容型の使いどきというテーマで書きます。

null許容型の使いどき
  • オブジェクトのメンバ
  • メソッドの戻り値

null許容型は、「変数に値がないかもしれない」ことを表します。null許容型でない場合は、null値を取らないことをコンパイラレベルで保証できます。

言語はC# 8.0 を使用します。

目次

null許容型とは

Null 許容値型T? は、基になる値型T のすべての値と、追加の null 値を表します。

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/nullable-value-types

また、C#8.0 以降は、null許容参照型が追加されました。値型に加えて、参照型も追加のnull値を表すことができます。逆に言えば、null値を代入しようとすると警告となります

null許容型とは、null許容値型とnull許容参照型を合わせたものと言えます。

null許容型の定義はネット上では見つけられませんでした。ここだけの定義とします。

null許容型は、「変数に値がないかもしれない」を表したいときに使います。

逆に言えば、null許容型を使用しない場合は、変数がnullにならないことをコンパイラレベルで保証することができます。null許容型でないものに、nullを代入すると警告が出ます。

null許容型を使用するときは、型に?をつけます。

int? a = null;
string? b = null;

変数a、bをnull許容型として扱うことができます。

オブジェクトのメンバで使用

オブジェクトのメンバとして、nullを使用したいときはnull許容型を使います。

ResultTimeクラスを考えてみます。マラソンや100m走などの結果のタイムを表します。

途中リタイアも考慮します。途中リタイアの場合は、メンバのnull許容型 _timeに対し、nullを代入します。

/// <summary>
/// リザルトタイム
/// </summary>
internal class ResultTime
{
    /// <summary>
    /// タイム
    /// </summary>
    /// <remarks>失格はnull</remarks>
    private TimeSpan? _time;

    public ResultTime()
    {
        _time = null;
    }

    public ResultTime( TimeSpan _time)
    {
        this._time = _time;
    }

    /// <summary>
    /// hh:mm:ss形式の文字列を返す
    /// </summary>
    /// <remarks>失格はDNF</remarks>
    /// <returns></returns>
    public override string ToString()
    {
        return _time?.ToString(@"hh\:mm\:ss") ?? "DNF";
    }
}

ToString メソッドで、失格の場合はDNFと返すようにしました。

クラスのメンバは、むやみにnull許容型にすべきではありませんnull許容型でないメンバは、値が設定されていることを保証できます

nullを使用したくなったときだけ、null許容型を使用します。

メソッドの戻り値で使用

ファーストコレクションクラスの検索で、検索結果何もないとき、nullを返したくなります。このとき戻り値の型をnull許容型とします。

詳しくは↓の記事の「nullを返したくなるとき」章を参考にしてください。

メソッドの引数で使用

メソッドの引数のnull許容型は使用しない方がいいです。オブジェクトを使う側で、null判定をするようにした方がいいです。

詳しくは↓の記事を参考にしてください。

まとめ

オブジェクト指向設計においてnull許容型の使いどきというテーマで書きました。

null許容型の使いどき
  • オブジェクトのメンバ
  • メソッドの戻り値
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次