跳至內容

空值結合運算符

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

空值結合運算符(在Perl稱邏輯定義或運算符)是一種二元運算符,是多種編程語言的基本條件表達式語法的一部分,包括C#[1]、PowerShell 7.0.0、Perl 5.10,Swift,PHP 7.0.0。雖然其行為因實現而異,但空值合併運算符首先考慮返回其左操作數的值(如果左操作數存在且不為空) ,其次考慮返回右操作數的值。此行為可為特定值不可用的情況定義缺省值。

與三元條件表達式 x?x:y中表達式x可能求值2次相比,空值結合運算符更類似二元埃爾維斯運算符x?:y,操作數求值至多一次,這在x的求值有副作用情況下特別有意義。

編程語言用法

Bash

Bash中,「如果參數未設置或為空,則用缺省值替代」:[2]

#supplied_title='supplied title' # Uncomment this line to use the supplied title
title=${supplied_title:-'Default title'}
echo "$title" # prints: Default title

C#

C#中,空值結合運算符是??.常用於簡化表達式:

possiblyNullValue ?? valueIfNull

例如,如果希望C#源碼給一個頁缺省頁標題:

string pageTitle = suppliedTitle ?? "Default Title";

以代替更囉嗦的實現:

string pageTitle = (suppliedTitle != null) ? suppliedTitle : "Default Title";

或者

string pageTitle;

if (suppliedTitle != null)
{
    pageTitle = suppliedTitle;
}
else
{
    pageTitle = "Default Title";
}

上述3種實現給pageTitle相同的結果。

注意表達式suppliedTitle??運算符下求值1次,而在另外2種代碼例子種可能求值2次。

該運算符在同一個表達式可以使用多次:

return some_Value ?? some_Value2 ?? some_Value3;

從C# 8.0起,支持??=空值結合賦值運算符:

some_Value ??= some_Value2;

以代替囉嗦的寫法:

some_Value = some_Value ?? some_Value2;

結合使用空值條件運算符英語null-conditional operator?.或空值條件成員訪問運算符?[],空值結合運算符可在對象為空或對象的成員為空時提供缺省值。例如,下述例子中page對象為空或者page不為空但其屬性Title為空,則提供缺省值:

string pageTitle = page?.Title ?? "Default Title";

JavaScript

JavaScript最接近的運算符是??, 即"nullish coalescing operator",從ECMAScript第11版引入。[3]當左端操作數不為"nullish" (nullundefined),取其值作為結果,否則取右端操作數作為結果。 例如:

const a = b ?? 3;

邏輯或運算符(||)對任何布爾假值:null, undefined, "", 0, NaN, false,都會取右端操作數的值。

Python

Python沒有空值結合運算符。可用條件表達式模擬其功能:

now() if time is None else time

Python的or運算符提供了類似但不同的行為。區別在於,如果左操作數的結果為Falseor也會返回右操作數的值:

42    or "something"  # returns 42
0     or "something"  # returns "something"
False or "something"  # returns "something"
""    or "something"  # returns "something"
None  or "something"  # returns "something"

而真正的空值結合運算符僅在最後一種情況下返回結果"something",而在左操作數為(0, False, "")時返迴響應值。

PowerShell

PowerShell 7 提供了??空值結合運算符:[4]

$myVar = $null
$x = $myVar ?? "something" # assigns "something"

SQL

Oracle的PL/SQL, NVL()函數提供了這種輸出:

NVL(possibly_null_value, 'value if null');

SQL Server/Transact-SQL有ISNULL函數,其原型為:

ISNULL(possibly_null_value, 'value if null');

注意ISNULLIS NULL不同,後者判斷表達式是否為空。

ANSI SQL-92標準包括了一個COALESCE函數,在Oracle,[5] SQL Server,[6] PostgreSQL,[7] SQLite[8] and MySQL.[9]都被實現了。COALESCE函數返回第一個不為空的參數的結果,如果所有參數都為空,則返回空。

COALESCE(possibly_null_value[, possibly_null_value, ...]);

VB.NET

VB.NET中的If[10]運算符/關鍵字得到空值結合運算符的效果。

Dim pageTitle = If(suppliedTitle, "Default Title")

這比下述寫法更精煉:

Dim pageTitle = If(suppliedTitle <> Nothing, suppliedTitle, "Default Title")

參考文獻

  1. ^ BillWagner. ?? Operator (C# Reference). msdn.microsoft.com. [2021-08-23]. (原始內容存檔於2017-03-17). 
  2. ^ Bash man page. [2021-08-30]. (原始內容存檔於2019-12-27). 
  3. ^ ECMAScript 2020 Language Specification. Ecma International. June 2020 [2021-08-30]. (原始內容存檔於2020-12-23). 
  4. ^ 引用錯誤:沒有為名為:0的參考文獻提供內容
  5. ^ Database SQL Language Reference. docs.oracle.com. [2021-08-30]. (原始內容存檔於2021-08-30). 
  6. ^ COALESCE (SQL Server Compact). technet.microsoft.com. [2021-08-30]. (原始內容存檔於2017-08-26). 
  7. ^ PostgreSQL: Documentation: 9.1: Conditional Expressions. www.postgresql.org. [2021-08-30]. (原始內容存檔於2018-03-09). 
  8. ^ SQLite Query Language: Core Functions. www.sqlite.org. [2021-08-30]. (原始內容存檔於2022-01-18). 
  9. ^ MySQL :: MySQL 5.5 Reference Manual :: 12.3.2 Comparison Functions and Operators. dev.mysql.com. [2021-08-30]. (原始內容存檔於2019-12-26). 
  10. ^ dotnet-bot. If Operator (Visual Basic). docs.microsoft.com. [2021-08-30]. (原始內容存檔於2022-01-21).