はじめに
null-aware演算子の書き方についてまとめていこうと思います。
A ??= B (AがNullの時だけBをAに代入する )
String? x; x ??= "ABC"; // xはNullなので ”ABC"が代入される print(x); // ABC x ??= "DEF"; // xはNullではないので、"ABC"のまま print(x); // ABC
??=演算子
は左辺がNullの時だけ右辺で初期化するってことですね!
A ?? B (AがNUllならBを)
String? str1; // 未初期化なのでNull String? str2; // 未初期化なのでNull str1 = str2 ?? "ABC"; // str2はNullなので代わりにABCが代入される print(str1); // ABC str2 = "DEF"; // 初期化された str1 = str2 ?? "XYZ"; // str2はNullじゃないのでstr2を代入 (XYZは使用されない) print(str1); // DEF
??演算子
は左辺がNullじゃなければ左辺を、Nullなら右辺を使うってことですね?
これを??演算子
を使わない書き方にするとこんな感じ。
if (str2 != null) { str1 = str2; } else { str1 = "XYZ"; }
??演算子
を使うとこれを1行で書けるってことですね。
XXX?.Func() (変数がNullじゃなければアクセス)
TestClass? test; // 初期化していないのでNull test?.Func(); // Nullなので実行されない test = TestClass(); // 初期化された test?.Func(); // Nullじゃないので実行される
これを?.演算子
を使わない書き方にするとこんな感じ。
if (test != null) { test.Func(); }
いわゆるNullチェックをしてアクセスするというやつです。
Nullチェックをするとアンラップされるのでそのままアクセスできます。
アンラップについてはこちらを参考にしてみてください。