C#: こんな時どうなる?(nullの場合の動作)

C#
この記事は約4分で読めます。
スポンサーリンク
スポンサーリンク

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"}{}: emptynull
.Select(c => c){"red", "green", "blue"}{}ArgumentReferenceException
.Where(c => c == "blue"){"blue"}{}ArgumentReferenceException
.FirstOrDefault(){"red"}nullArgumentReferenceException
.First(){"red"}InvalidOperationExceptionArgumentReferenceException

上表から以下のことがわかります。

  • 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

コメント

タイトルとURLをコピーしました