Null coalescing operator
The null coalescing operator (called the Logical Defined-Or operator in Perl) is a binary operator that is part of the syntax for a basic conditional expression in several programming languages, including C#, and Perl as of version 5.10.
In C#, the null coalescing operator is
??. It is most often used to simplify null expressions as follows:
possiblyNullValue ?? valueIfNull
For example, if one wishes to implement some C# code to give a page a default title if none is present, one may use the following statement:
string pageTitle = suppliedTitle ?? "Default Title";
instead of the more verbose
string pageTitle = (suppliedTitle == null) ? "Default Title" : suppliedTitle;
string pageTitle; if (suppliedTitle == null) pageTitle = "Default Title"; else pageTitle = suppliedTitle;
The three forms are logically equivalent.
The operator can also be used multiple times in the same expression:
return some_Value ?? some_Value2 ?? some_Value3;
Once a non-null value is assigned to number, or it reaches the final value (which may or may not be null), the expression is completed.
In Perl (starting with version 5.10), the operator is
// and the equivalent Perl code is:
$possibly_null_value // $value_if_null
The possibly_null_value is evaluated as null or not-null (or, in Perl, undefined or defined). On the basis of the evaluation, the expression returns either value_if_null when possibly_null_value is null, or possibly_null_value otherwise. This is similar to the way ternary operators (
?: statements) work in languages that support them. The above Perl code is equivalent to the use of the ternary operator below:
defined($possibly_null_value) ? $possibly_null_value : $value_if_null
This operator's most common usage is to minimize the amount of code used for a simple null check.
As with other languages that treat certain non-null values as boolean false (in Perl's case, 0 and the empty string), the boolean or operator "||" is not a null coalescing operator.
DB<1> print 0 // 1 # A null coalescing operator 0 DB<2> print 0 || 1 # Not a null coalescing operator 1
Perl additionally has a
//= assignment operator, where
a //= b
is largely equivalent to:
a = a // b
NVL(possibly_null_value, 'value if null');
ISNULL(possibly_null_value, 'value if null');
Attention should be taken to not confuse ISNULL with IS NULL – the latter serves to evaluate whether some contents are defined to be NULL or not.
The ANSI SQL-92 standard includes the COALESCE function implemented in Oracle, SQL Server, PostgreSQL, SQLite and MySQL. The COALESCE function returns the first argument that is not null. If no terms are not null, returns null.
COALESCE(possibly_null_value[, possibly_null_value, ...]);
Python's "or" operator is not a null coalescing operator, as demonstrated below:
>>> 0 or 1 1
If or were a null coalescing operator, it would return the first non-null argument, which is 0. (0 and null, called None in Python, are distinct concepts.) In practice, however, the or operator is sometimes used for this purpose when the left operand is guaranteed not to be 0 or False (or when distinguishing them from None is not important).
In Scheme, "boolean false" and "null" are represented by the same value, written as #f. Furthermore, #f is the only value in Scheme that is treated as false by boolean operators, unlike some other languages, in which values like 0, the empty string, and the empty list may function as false. The boolean 'or' operation, written as (or x y), returns x if it is not false, otherwise it returns y. Thus, in Scheme, there is no need for a separate "null coalescing operator", because the or operator serves that purpose.
- ?? Operator (C# Reference)
- // Operator (Perl Reference)