Я знаю, что стандартным способом использования оператора объединения нулей в C # является установка значений по умолчанию.
string nobody = null;
string somebody = "Bob Saget";
string anybody = "";
anybody = nobody ?? "Mr. T"; // returns Mr. T
anybody = somebody ?? "Mr. T"; // returns "Bob Saget"
Но для чего еще можно ??
использовать? Он не кажется таким полезным, как троичный оператор, кроме того, что он более лаконичен и удобен для чтения, чем:
nobody = null;
anybody = nobody == null ? "Bob Saget" : nobody; // returns Bob Saget
Так что, учитывая, что меньше всего знают об операторе слияния нуля ...
Вы использовали
??
для чего-то еще?Это
??
необходимо, или вы должны просто использовать троичный оператор (с которым большинство знакомо)
c#
coding-style
null
conditional-operator
null-coalescing-operator
Armstrongest
источник
источник
Я использовал его как однорядную ленту загрузки:
Удобочитаемый? Решай сам.
источник
Я нашел это полезным двумя «немного странными» способами:
out
параметра при записиTryParse
подпрограмм (т. Е. Возвращает нулевое значение, если синтаксический анализ не удается)Последнему нужно немного больше информации. Как правило, когда вы создаете сравнение с несколькими элементами, вам нужно увидеть, дает ли первая часть сравнения (например, возраст) окончательный ответ, а затем следующую часть (например, имя), только если первая часть не помогла. Использование оператора объединения нулей означает, что вы можете писать довольно простые сравнения (для упорядочения или равенства). Например, используя пару вспомогательных классов в MiscUtil :
По общему признанию у меня теперь есть ProjectionComparer в MiscUtil, наряду с некоторыми расширениями, которые делают такие вещи еще проще - но это все еще опрятно.
То же самое можно сделать для проверки на референтное равенство (или нулевое значение) в начале реализации Equals.
источник
Другое преимущество состоит в том, что троичный оператор требует двойной оценки или временной переменной.
Рассмотрим это, например:
в то время как с троичным оператором у вас остается либо:
который вызывает MyMethod дважды, или:
В любом случае, оператор нулевого слияния чище и, я думаю, более эффективен.
источник
MyMethod()
есть побочные эффекты.MyMethod()
за пределами возврата значения нет никаких эффектов, компилятор знает, что его нельзя вызывать дважды, поэтому вам не нужно беспокоиться об эффективности здесь в большинстве случаев.MyMethod()
это последовательность цепочек пунктирных объектов. Пример:myObject.getThing().getSecondThing().getThirdThing()
MyMethod
в этом контексте два вызова идентичны, предполагая, чтоMyMethod
это чистая функция. Другой вариант - автоматическая памятка или просто закрытие функции в кеше. С другой стороны: en.wikipedia.org/wiki/Global_value_numberingЕще одна вещь, которую следует учитывать, это то, что оператор coalesce не вызывает метод get свойства дважды, как это делает троичный.
Таким образом, есть сценарии, где вы не должны использовать троичный, например:
Если вы используете:
геттер будет вызван дважды, а
count
переменная будет равна 2, и если вы используете:count
переменная будет равна 1, как это должно быть.источник
??
является эквивалентом для?:
.Самое большое преимущество, которое я нахожу для
??
оператора, состоит в том, что вы можете легко преобразовывать типы значений, допускающие значения NULL, в типы, не допускающие значения NULL:Я часто использую это в запросах Linq:
источник
kvp == null
. И на самом делеNullable<T>
естьGetValueOrDefault
метод, который я обычно использую.Я использовал ?? в моей реализации IDataErrorInfo:
Если какое-либо отдельное свойство находится в состоянии «ошибка», я получаю эту ошибку, в противном случае я получаю ноль. Работает действительно хорошо.
источник
this["Name"]
,this["Address"]
и т.д. ??Вы можете использовать оператор объединения нулей, чтобы сделать его немного чище для обработки случая, когда необязательный параметр не установлен:
источник
arg ?= Arg.Default
?Мне нравится использовать оператор null coalesce для отложенной загрузки определенных свойств.
Очень простой (и надуманный) пример, чтобы проиллюстрировать мою точку зрения:
источник
На самом деле, мой опыт показывает, что слишком немногие знакомы с троичным оператором (или, точнее, условным оператором; он
?:
является «троичным» в том же смысле, что||
является двоичным,+
либо унарным, либо двоичным; только троичный оператор во многих языках), так что, по крайней мере, в этом ограниченном примере, ваше утверждение терпит неудачу прямо здесь.Кроме того, как упоминалось ранее, существует одна важная ситуация, когда оператор слияния нуля очень полезен, и это когда всякий раз вычисляемое выражение имеет какие-либо побочные эффекты. В этом случае вы не можете использовать условный оператор без (а) введения временной переменной или (б) изменения фактической логики приложения. (б) явно не подходит ни при каких обстоятельствах, и хотя это личное предпочтение, мне не нравится загромождать область объявления множеством посторонних, даже если недолговечных переменных, поэтому (а) слишком конкретный сценарий.
Конечно, если вам нужно выполнить несколько проверок результата, условный оператор или набор
if
блоков, вероятно, являются инструментом для работы. Но для простого «если это ноль, используйте это, иначе используйте его», оператор слияния ноль??
идеален.источник
В последнее время я часто использовал одну вещь - использовать объединение нулей для резервного копирования
as
. Например:Это также полезно для резервного копирования длинных цепочек
?.
, каждый из которых может потерпеть неудачуисточник
Единственная проблема в том, что оператор null-coalesce не обнаруживает пустые строки.
т.е.
ВЫВОД:
В настоящее время я смотрю на переопределение ?? Оператор обойти это. Конечно, было бы удобно встроить это в Framework.
Мысли?
источник
??
не может быть перегружен: msdn.microsoft.com/en-us/library/8edha89s(v=vs.100).aspx - это было бы здорово, если бы была перегружена. Я использую комбинацию:s1.Nullify() ?? s2.Nullify()
гдеstring Nullify(this s)
возвращает anull
в случаях, когда строка пуста.Вы должны использовать то, что лучше всего выражает ваши намерения. Поскольку это оператор COALESCE нуля, использовать его .
С другой стороны, так как это настолько специализировано, я не думаю, что у этого есть другое использование. Я бы предпочел соответствующую перегрузку
||
оператора, как это делают другие языки. Это было бы более экономно в дизайне языка. Но хорошо …источник
Прохладно! Считай меня кем-то, кто не знал об операторе слияния null - это довольно изящная штука.
Мне гораздо легче читать, чем троичный оператор.
Первое, что приходит на ум, где я могу использовать это - хранить все мои параметры по умолчанию в одном месте.
источник
Немного странный вариант использования, но у меня был метод, в котором
IDisposable
объект потенциально передается как аргумент arg (и, следовательно, располагается родителем), но также может иметь значение null (поэтому его следует создавать и удалять в локальном методе).Чтобы использовать его, код либо выглядел как
Но с нулевым слиянием становится намного аккуратнее
источник
Я использовал так:
источник