本記事では、オブジェクト指向設計においてnull許容型の使いどきというテーマで書きます。
- オブジェクトのメンバ
- メソッドの戻り値
null許容型は、「変数に値がないかもしれない」ことを表します。null許容型でない場合は、null値を取らないことをコンパイラレベルで保証できます。
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許容型の使いどきというテーマで書きました。
- オブジェクトのメンバ
- メソッドの戻り値
コメント