安全導航運算符
外觀
在面向對象程序設計中,安全導航運算符(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
參見
[編輯]參考文獻
[編輯]- ^ Member access operators (C# reference). Microsoft Docs. Microsoft. [29 August 2019]. (原始內容存檔於2022-06-12).
- ^ 存档副本. [2021-09-24]. (原始內容存檔於2021-12-07).
- ^ PHP: rfc:nullsafe_operator. wiki.php.net. [2020-10-01]. (原始內容存檔於2022-05-31).
- ^ PEP 505 -- None-aware operators. [2018-08-27]. (原始內容存檔於2022-02-24).
- ^ Typescript 3.7. [2019-11-06]. (原始內容存檔於2022-06-09).
- ^ ?. and ?() null-conditional operators (Visual Basic). Microsoft Docs. Microsoft. [29 August 2019]. (原始內容存檔於2022-05-18).