it's an equivalent of
(str == null ? string.Empty : str)
It's called the null coalescing operator. It allows you conditionally select first non-null value from a chain:
string name = null;
string nickname = GetNickname(); // might return null
string result = name ?? nickname ?? "<default>";
The value in result will be either the value of nickname if it's not null, or "<default>".
It's the null coalescing operator: it returns the first argument if it's non null, and the second argument otherwise. In your example, str ?? string.Empty is essentially being used to swap null strings for empty strings.
It's particularly useful with nullable types, as it allows a default value to be specified:
int? nullableInt = GetNullableInt();
int normalInt = nullableInt ?? 0;
Edit: str ?? string.Empty can be rewritten in terms of the conditional operator as str != null ? str : string.Empty. Without the conditional operator, you'd have to use a more verbose if statement, e.g.:
if (str == null)
{
str = string.Empty;
}
return str.Replace(txtFind.Text, txtReplace.Text);
str ?? String.Empty
could be written as:
if (str == null) {
return String.Empty;
} else {
return str;
}
or as a ternary statement:
str == null ? str : String.Empty;
The ?? operator says that return me the non null value. So, if you have the following code:
string firstName = null;
string personName = firstName ?? "John Doe";
The above code will return "John Doe" since firstName value is null.
That's it!