Уникальные способы использования оператора Null Coalescing - PullRequest
149 голосов
/ 10 ноября 2008

Я знаю, что стандартным способом использования оператора объединения нулей в 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

Так что, учитывая, что меньше всего знают об операторе слияния нуль ...

  • Вы использовали ?? для чего-то еще?

  • Является ли ?? необходимым, или вы должны просто использовать троичный оператор (который большинство знакомо с)

Ответы [ 16 ]

4 голосов
/ 29 июня 2016

В последнее время я часто делал одну вещь - использовал объединение нулей для резервного копирования на as. Например:

object boxed = 4;
int i = (boxed as int?) ?? 99;

Console.WriteLine(i); // Prints 4

Это также полезно для резервного копирования длинных цепочек ?., каждая из которых может выйти из строя

int result = MyObj?.Prop?.Foo?.Val ?? 4;
string other = (MyObj?.Prop?.Foo?.Name as string)?.ToLower() ?? "not there";
4 голосов
/ 10 марта 2009

Единственная проблема в том, что оператор null-coalesce не обнаруживает пустые строки.


т.е.

string result1 = string.empty ?? "dead code!";

string result2 = null ?? "coalesced!";

ВЫВОД:

result1 = ""

result2 = coalesced!

В настоящее время я изучаю переопределение ?? Оператор обойти это. Конечно, было бы удобно встроить это в Framework.

Мысли

3 голосов
/ 10 ноября 2008

Cool! Считай меня кем-то, кто не знал об операторе слияния null - это довольно изящная штука.

Мне гораздо легче читать, чем троичный оператор.

Первое, что приходит в голову, где я могу его использовать, - это хранить все мои параметры по умолчанию в одном месте.

public void someMethod( object parm2, ArrayList parm3 )
{ 
  someMethod( null, parm2, parm3 );
}
public void someMethod( string parm1, ArrayList parm3 )
{
  someMethod( parm1, null, parm3 );
}
public void someMethod( string parm1, object parm2, )
{
  someMethod( parm1, parm2, null );
}
public void someMethod( string parm1 )
{
  someMethod( parm1, null, null );
}
public void someMethod( object parm2 )
{
  someMethod( null, parm2, null );
}
public void someMethod( ArrayList parm3 )
{
  someMethod( null, null, parm3 );
}
public void someMethod( string parm1, object parm2, ArrayList parm3 )
{
  // Set your default parameters here rather than scattered through the above function overloads
  parm1 = parm1 ?? "Default User Name";
  parm2 = parm2 ?? GetCurrentUserObj();
  parm3 = parm3 ?? DefaultCustomerList;

  // Do the rest of the stuff here
}
3 голосов
/ 10 ноября 2008

Есть ?? необходимо, или вы должны просто использовать троичный оператор (с которым большинство знакомо)

Вы должны использовать то, что лучше всего выражает ваши намерения. Поскольку является нулевым оператором объединения, использует его .

С другой стороны, поскольку он настолько специализирован, я не думаю, что у него есть другие применения. Я бы предпочел соответствующую перегрузку оператора ||, как это делают другие языки. Это было бы более экономно в дизайне языка. Но хорошо ...

1 голос
/ 19 декабря 2016

Немного странный случай использования, но у меня был метод, в котором объект IDisposable потенциально передается как аргумент arg (и, следовательно, располагается родителем), но также может иметь значение null (поэтому его следует создавать и размещать в локальном метод)

Чтобы использовать его, код либо выглядел как

Channel channel;
Authentication authentication;

if (entities == null)
{
    using (entities = Entities.GetEntities())
    {
        channel = entities.GetChannelById(googleShoppingChannelCredential.ChannelId);
        [...]
    }
}
else
{
    channel = entities.GetChannelById(googleShoppingChannelCredential.ChannelId);
    [...]
}

Но с нулевым слиянием становится намного аккуратнее

using (entities ?? Entities.GetEntities())
{
    channel = entities.GetChannelById(googleShoppingChannelCredential.ChannelId);
    [...]
}
0 голосов
/ 20 сентября 2018

Оператор нуль-коалесцирования

Этот оператор проверяет переменную, если ноль, возвращает значение рядом с оператором «??», иначе возвращает значение, сохраненное в переменной.

Например: -1

var name=”ATHUL”;
var result =name ?? “The name is null”
Console.WriteLine(result);

о / п: ATHUL

Например: -2

var name=null;
var result =name ?? “The name is null”
Console.WriteLine(result);

o / p: имя равно нулю

...