Dart nullチェックのイディオムまたはベストプラクティスとは何ですか?


85

マップでの二重ルックアップを回避するために、次の形式の割り当てとnullチェックがあります。
Dartでこれを行うためのより良いまたはより慣用的な方法はありますか?

bool isConnected(a, b){
  List list;
  return (
    ((list = outgoing[a]) != null && list.contains(b)) ||
    ((list = incoming[a]) != null && list.contains(b))
  );
}

回答:


120

Dart 1.12以降、このタイプの状況ではnull認識演算子を使用できます。

bool isConnected(a, b) {
  bool outConn = outgoing[a]?.contains(b) ?? false;
  bool inConn = incoming[a]?.contains(b) ?? false;
  return outConn || inConn;
}

?.ヌルにオペレータ短絡左辺がnullである場合、および??オペレータがそれ以外の場合はnullでない場合、左側を返し、右側。

声明

outgoing[a]?.contains(b)

したがって、がであるかnullどうか 、またはそうでない場合のブール結果のいずれかに評価されます。outgoing[a]nullcontains(b)

つまり、結果のステートメントは次のいずれかになります。

bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true

同じことが適用されるにinConn両方を意味ブール、inConnoutConn私たちは結果を返すためにできるように、非nullであることが保証されている||2をINGのを。


outgoing[a]?.contains(b)少なくともGroovyセマンティクスでは、書き込みは危険です。outgoingnull、の場合、式全体がに評価されるためnullです。したがって、実際には、のようなものが得られる可能性がありreturn (null || true)ます。これは、チェックモードでスローされます。
Ladicek 2013年

未解決の問題のリンクをありがとう。
z5h 2013年

@Ladicekそれを指摘してくれてありがとう。??その問題を説明するために、更新された回答にnull合体演算子()を組み込みました。
ピクセルエレファント2015年


オブジェクトのフィールドを確認するには、と書くだけobject?.field ?? trueです。本当のところはあなたが望むものなら何でもありえます。
ティロ

50

現在、4つのnull認識演算子があります

?? 件名がnullの場合のデフォルトを提供します

return subject ?? "defaultIfNull";

?? =件名がnullの場合にのみ、件名をデフォルトに設定します

これは??に似ています ただし、サブジェクト変数がnullの場合は、デフォルトに設定します。

subject ??= "defaultIfNull";

?。サブジェクトのプロパティにアクセスするときにサブジェクトがnullの場合、例外を回避します

object?.xオブジェクトがnullの場合はnullを返し、オブジェクトがnullの場合はobject.x例外を引き起こします

...?スプレッドコレクションから、サブジェクトリストがnullの場合、最終リストでnullアイテムを回避します

以下の結果

[
  ...[1, 2],
  null,
]

です [1, 2, null]

null値を使用しないようにするには...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

2
?の使用に関する重要な注意事項:null許容参照aにvoidメソッドがあるmethod()場合、次の構文a?.method();は、aがnullでない場合にのみメソッドを実行します。
AlexSemeniuk19年

@AlexSemeniuk、素晴らしいポイントです!しかし、aがnullでない場合、このようなことを行う方法はありますか...このメソッドがオブジェクトaのクラスのメンバーでない場合、メソッドXYZ()を実行しますか?
YoApps20年

@YoAppsクラスシグネチャの一部ではないメソッドを実行したいということは明らかでしたか?私が知っているOOP言語で行うことはできません。
AlexSemeniuk20年

@AlexSemeniukええ、私も試してみましたが、機能しなかったので、古いものに戻しましたif(a!=null){XYZ();}
Yo Apps

1
@YoApps。ああ、あなたはこのコードを意味します。いいえ、Dartではできません。
AlexSemeniuk20年

15

タイトルを検索してここにたどり着いたので、以下を投稿します。

あたりとしてhttps://github.com/dart-lang/sdk/issues/66、どうやらその答え「とは何ダートヌルチェックイディオムやベストプラクティスです?」は:

一般的なケースでは、ヌルチェックのイディオムやベストプラクティスはありません。null対応の演算子がケースに合わない場合は、if (object == null)またはのように直接比較を使用してくださいif (object != null)


1
彼らは今オプションを持っています:
オリバーディクソン

0
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;

このコードは質問に答えることができますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。答える方法。敬具。
Elletlar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.