安全導航運算子

物件導向程式設計中,安全導航運算子(safe navigation operator,也可稱作optional chaining operator、safe call operator、null-conditional operator)是一個二元運算子,在第一個實參為空值時返回空值,否則按照第二個實參執行解除參照(dereference)操作(典型如對象成員訪問,陣列索引,lambda呼叫)。

在程式語言中,導航運算子(navigation operator,例如 ".") 如果應用到空對象將會導致一個錯誤。安全導航運算子在這種情況下會中止對方法或者欄位的鏈式求值並返回空值。這避免了順序地顯式空值檢查。主要優點是避免了詛咒金字塔現象。不必寫多層巢狀if語句,編程者可以寫正常的鏈式表達式。

安全導航運算子空值結合運算子二者都是空值感知運算子(null-aware operator)。

各語言例子

C#

C# 6.0及更新版本支援?., 叫做空值條件成員訪問運算子(null-conditional member access operator),類似地還有??空值結合運算子)與?[](空值條件元素訪問運算子)。如果成員訪問的結果是值類型,則應該是該類型的可空的版本[1]

例如:

var name = articles?[0]?.Author?.Name;

呼叫lambda需要callback?.Invoke(),例如:

var result = callback?.Invoke(args);

JavaScript

從ECMAScript 2020開始支援可選鏈式運算子。[2]

const name = article?.authors?.[0]?.name
const result = callback?.()

PHP

安全導航運算子自PHP 8起開始支援:[3]

$name = $article?->author?->name;

Python

尚不支援空值感知運算子。[4]

TypeScript

Typescript 3.7開始支援可選鏈式運算子[5],例如:

let x = foo?.bar?.[0]?.baz();

Visual Basic .NET

Visual Basic 14開始支援?.?() (空值下標訪問),類似於C#.[6]

例如:

Dim name = articles?(0)?.Author?.Name

參見

參考文獻

  1. ^ Member access operators (C# reference). Microsoft Docs. Microsoft. [29 August 2019]. (原始內容存檔於2022-06-12). 
  2. ^ 存档副本. [2021-09-24]. (原始內容存檔於2021-12-07). 
  3. ^ PHP: rfc:nullsafe_operator. wiki.php.net. [2020-10-01]. (原始內容存檔於2022-05-31). 
  4. ^ PEP 505 -- None-aware operators. [2018-08-27]. (原始內容存檔於2022-02-24). 
  5. ^ Typescript 3.7. [2019-11-06]. (原始內容存檔於2022-06-09). 
  6. ^ ?. and ?() null-conditional operators (Visual Basic). Microsoft Docs. Microsoft. [29 August 2019]. (原始內容存檔於2022-05-18). 

外部連結