Flutterでは、nullセーフティが導入されました。これにより、変数やオブジェクトがnullである可能性がある場合、その変数やオブジェクトの使用に関して明示的な処理が必要となります。そのために、?演算子と!演算子が使用されます。
- ?演算子(Null安全演算子): ?演算子は、オブジェクトがnullでない場合にその値を返し、nullの場合にはnullを返します。これは、オブジェクトがnullである可能性がある場合に使用されます。以下に例を示します。
String? name = getName();
String message = name?.toUpperCase() ?? "No name provided";
上記の例では、getName()
関数がnullでない場合はその値をname
変数に代入し、nullの場合はname
変数にnullを代入します。name?.toUpperCase()
は、name
がnullでない場合には大文字に変換した値を返し、nullの場合にはnullを返します。??
演算子は、左側の式がnullの場合に右側の式を評価し、その結果を返します。つまり、name?.toUpperCase() ?? "No name provided"
は、name
がnullでない場合には大文字に変換した値を、nullの場合にはデフォルトのメッセージ "No name provided" をmessage
変数に代入します。
- !演算子(null断言演算子): !演算子は、オブジェクトがnullでないことを明示的に宣言します。つまり、!演算子を使用すると、オブジェクトがnullでないことを保証している場合にのみ使用する必要があります。以下に例を示します。
String? name = getName();
String message = name!.toUpperCase();
上記の例では、getName()
関数がnullでない場合はその値をname
変数に代入し、nullの場合はname
変数にnullを代入します。name!.toUpperCase()
は、name
がnullでないことを明示的に宣言しているため、nullである可能性がないとしてオブジェクトを使用します。ただし、もしname
がnullである場合、実行時エラーが発生します。
注意点:
- できるだけ!演算子の使用を避けることをお勧めします。null安全機能は、コードの信頼性を向上させるために導入されたものであり、!演算子の乱用はnull安全性を損なう可能性があります。
- 返り値がnullの可能性がある関数やメソッドを呼び出す場合は、?演算子を使用してnullをチェックすることで、エラーを回避することができます。
以上がFlutterにおける?演算子と!演算子の違いについての説明です。