安全导航运算符

面向对象程序设计中,安全导航运算符(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). 

外部链接

  • PEP 505页面存档备份,存于互联网档案馆), discussing the possibility of safe navigation operators for Python