空值結合運算子
空值結合運算子(在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;
結合使用空值條件運算子?.
或空值條件成員訪問運算子?[]
,空值結合運算子可在對象為空或對象的成員為空時提供預設值。例如,下述例子中page
對象為空或者page
不為空但其屬性Title
為空,則提供預設值:
string pageTitle = page?.Title ?? "Default Title";
JavaScript
編輯JavaScript最接近的運算子是??
, 即"nullish coalescing operator",從ECMAScript第11版引入。[3]當左端運算元不為"nullish" (null
或undefined
),取其值作為結果,否則取右端運算元作為結果。 例如:
const a = b ?? 3;
邏輯或運算子(||
)對任何布林假值:null
, undefined
, ""
, 0
, NaN
, false
,都會取右端運算元的值。
Python
編輯Python沒有空值結合運算子。可用條件表達式類比其功能:
now() if time is None else time
Python的or
運算子提供了類似但不同的行為。區別在於,如果左運算元的結果為False
,or
也會返回右運算元的值:
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');
注意ISNULL與IS 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")
參考文獻
編輯- ^ BillWagner. ?? Operator (C# Reference). msdn.microsoft.com. [2021-08-23]. (原始內容存檔於2017-03-17).
- ^ Bash man page. [2021-08-30]. (原始內容存檔於2019-12-27).
- ^ ECMAScript 2020 Language Specification. Ecma International. June 2020 [2021-08-30]. (原始內容存檔於2020-12-23).
- ^ 參照錯誤:沒有為名為
:0
的參考文獻提供內容 - ^ Database SQL Language Reference. docs.oracle.com. [2021-08-30]. (原始內容存檔於2021-08-30).
- ^ COALESCE (SQL Server Compact). technet.microsoft.com. [2021-08-30]. (原始內容存檔於2017-08-26).
- ^ PostgreSQL: Documentation: 9.1: Conditional Expressions. www.postgresql.org. [2021-08-30]. (原始內容存檔於2018-03-09).
- ^ SQLite Query Language: Core Functions. www.sqlite.org. [2021-08-30]. (原始內容存檔於2022-01-18).
- ^ MySQL :: MySQL 5.5 Reference Manual :: 12.3.2 Comparison Functions and Operators. dev.mysql.com. [2021-08-30]. (原始內容存檔於2019-12-26).
- ^ dotnet-bot. If Operator (Visual Basic). docs.microsoft.com. [2021-08-30]. (原始內容存檔於2022-01-21).