C#のヌル許容型:null値を安全に扱う完全ガイド
C#にはヌル許容型(nullable types)という特別なデータ型があり、通常の値の範囲に加えてnull値を割り当てることができます。
例えば、Nullable<Int32>変数には、-2,147,483,648から2,147,483,647の値またはnullを格納できます。同様に、Nullable<bool>変数にはtrue、false、またはnullを割り当てできます。
ヌル許容型の宣言構文
<data_type>? <variable_name> = null;
この?はNullable<T>のシンタックスシュガー(簡易記法)です。以下の2つは等価です:
int? num1 = null;
Nullable<int> num2 = null;
ヌル許容型の使用例
using System;
namespace CalculatorApplication {
class NullablesAtShow {
static void Main(string[] args) {
int? num1 = null;
int? num2 = 45;
double? num3 = new double?(); // デフォルト値はnull
double? num4 = 3.14157;
bool? boolval = new bool?(); // デフォルト値はnull
// 値の表示
Console.WriteLine("Nullables at Show: {0}, {1}, {2}, {3}", num1, num2, num3, num4);
Console.WriteLine("A Nullable boolean value: {0}", boolval);
Console.ReadLine();
}
}
}
実行結果:
Nullables at Show: , 45, , 3.14157
A Nullable boolean value:
※ nullの場合は空文字として表示されます。
ヌル許容型の主要プロパティとメソッド
| メンバー | 説明 |
|---|---|
HasValue | 値を持っているかどうかを示すboolプロパティ |
Value | 格納されている値を取得(値がない場合は例外) |
GetValueOrDefault() | 値がある場合はその値、ない場合はデフォルト値(0等)を返す |
GetValueOrDefault(T defaultValue) | 値がない場合に指定したデフォルト値を返す |
プロパティの使用例
int? num = null;
Console.WriteLine(num.HasValue); // False
Console.WriteLine(num.GetValueOrDefault()); // 0
Console.WriteLine(num.GetValueOrDefault(-1)); // -1
int? num2 = 42;
Console.WriteLine(num2.HasValue); // True
Console.WriteLine(num2.Value); // 42
// Console.WriteLine(num.Value); // 例外: InvalidOperationException
Null 合体演算子(??)
Null合体演算子は、ヌル許容値型および参照型で使用されます。暗黙的な変換が可能な場合、オペランドを別のヌル許容(または非ヌル許容)値型の型に変換するために使用されます。
最初のオペランドの値がnullの場合、演算子は2番目のオペランドの値を返し、そうでなければ最初のオペランドの値を返します。
Null合体演算子の例
using System;
namespace CalculatorApplication {
class NullablesAtShow {
static void Main(string[] args) {
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34; // num1がnullなので5.34が代入
Console.WriteLine("Value of num3: {0}", num3);
num3 = num2 ?? 5.34; // num2はnullでないので3.14157が代入
Console.WriteLine("Value of num3: {0}", num3);
Console.ReadLine();
}
}
}
実行結果:
Value of num3: 5.34
Value of num3: 3.14157
Null 条件演算子(?. / ?[])
C# 6.0以降では、Null条件演算子を使用してnullチェックを簡潔に記述できます。
// 従来の書き方
if (person != null && person.Address != null) {
Console.WriteLine(person.Address.City);
}
// Null条件演算子を使用
Console.WriteLine(person?.Address?.City); // いずれかがnullならnullを返す
// 配列/リストの要素アクセス
var firstItem = list?[0]; // listがnullならnullを返す
null許容参照型(C# 8.0以降)
C# 8.0から、参照型もデフォルトでnon-nullableになり、明示的に?を付けてnullableにできます(プロジェクト設定で有効化が必要)。
#nullable enable
string nonNull = "hello"; // null非許容
string? nullable = null; // null許容
nonNull = null; // 警告: nullの代入
nullable = "world"; // OK
ベストプラクティス
- 値型で「値がない」状態を表現する必要がある場合にヌル許容型を使用する
HasValue/ValueよりGetValueOrDefault()や??演算子を優先して安全に値を取得する- データベースからの取得値(DBNullの可能性)にはヌル許容型が適している
- C# 8.0以降のプロジェクトでは
#nullable enableを有効にし、参照型のnull安全性を高める - 公開APIでは、引数や戻り値のnull許容性を明示的にドキュメント化する
C言語
- AgCu20 合金:23°C における包括的な機械的・熱的特性
- 合金 15CDV6(DIN 1.7734):高強度・高靭性、容易な溶接性
- DIN 1.7734 5 - 15CDV6合金:高強度、高靭性、容易な溶接性
- 15CDV6合金(DIN 1.7734) - 高強度、容易な溶接性、優れた靭性
- PtNi10 合金:包括的な機械的・熱的特性
- PtIr10 白金-イリジウム合金:高強度・高温材料
- Corroplastプレート – 精密機械加工向け高性能耐食鋼
- X46 AM FCE:重要パイプライン用途向け高性能API 5L鋼
- フェロ・チタニット® クロモニ – 高強度、非磁性チタン合金
- C#属性:メタデータでコードを拡張する完全ガイド
- Java 8 Optional完全ガイド:実践的なNull安全コードの書き方