nullのListをforeach
foreachできない。
foreachが実行される前に、NullReferenceExceptionがスローされます。
Listがnullである可能性がある場合には、事前にnullチェックが必要になります。
List<string> list = null; // listがnull
if (list != null) // nullチェック
{
foreach (var item in list) // nullの場合、NullReferenceException発生
{
// ループ内での処理
}
}
ListにnullをAdd
nullを追加できます。
ListのAddメソッドは、nullをリストに追加することができます。
List<string> list = new List<string>();
list.Add(null); // null追加できる
Listがnullの場合の実行結果
ListのLINQメソッドの実行結果をまとめました。
Listに要素がある時{"red", "green", "blue"}、空の時{}、nullの時の各LINQメソッド(Select、Where、FirstOrDefault、First)の実行結果を以下の表にまとめています。
{"red", "green", "blue"} | {}: empty | null | |
---|---|---|---|
.Select(c => c) | {"red", "green", "blue"} | {} | ArgumentReferenceException |
.Where(c => c == "blue") | {"blue"} | {} | ArgumentReferenceException |
.FirstOrDefault() | {"red"} | null | ArgumentReferenceException |
.First() | {"red"} | InvalidOperationException | ArgumentReferenceException |
上表から以下のことがわかります。
- Listがnullの場合には、ArgumentNullExceptionが発生する。Nullチェックが事前に必要。
- 該当する要素がないとき、FirstOrDefaultとFirstの実行結果は異なる。
FirstOrDefaultは例外は発生せずにnullが返される。
一方、FirstはInvalidOperationExceptionが発生する。
参考: Nullチェックの書き方
ここまで述べた通り、Nullチェックが必要な場合があることがわかりました。
ここでは、Nullチェックの書き方をまとめています。
ifを使用した方法
「if else」を使用した、よく見る方法です。
string str = null;
if (str != null)
{
// strはnullではない場合の処理
}
else
{
// strがnullの場合の処理
}
三項条件演算子を使用した方法
三項条件演算子「? :」を使用した方法です。
string str = null;
string result = str != null ? str.ToUpper() : "default";
null合体演算子を使用した方法
null合体演算子「??」を使用した方法です。
string str = null;
string result = str ?? "default";
// strがnullでない場合: result = str
// strがnullの場合:result = "default"
null条件演算子を使用した方法
null条件演算子「?.」を使用した方法です。
string[] array = null;
int? length = array?.Length;
// arrayがnullでない場合: length = array.length
// arrayがnullの場合: length = null
コメント