C# null-условное сокращение для аргументов метода

Нулевой условный оператор очень полезен, когда метод принадлежит рассматриваемому объекту, но что, если рассматриваемый объект является аргументом? Например, можно ли это сократить?

var someList = new List<SomeType>();
if (anotherList.Find(somePredicate) != null)
{
    someList.Add(anotherList.Find(somePredicate))
}

Одним из решений, о котором я подумал, было использование метода расширения, как показано ниже:

public static void AddTo<T>(this T item, List<T> list)
{
    list.Add(item);
}

При этом первый кодовый блок может быть уменьшен до:

var someList = new List<SomeType>();
anotherList.Find(somePredicate)?.AddTo(someList);

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

3 ответа

Решение

Никогда не делай этого

var someList = new List<SomeType>();
if (anotherList.Find(somePredicate) != null)
{
    someList.Add(anotherList.Find(somePredicate))
}

это будет искать список дважды, что не нужно. используйте вместо этого временную переменную.

var someList = new List<SomeType>();
var find = anotherList.Find(somePredicate);
if (find != null) someList.Add(find);

Есть ли общий способ указать, что если параметр имеет значение null, метод не должен запускаться?

В настоящее время такой функции нет. как бы то ни было, есть другие альтернативы, которые работают лучше, чем в других ответах.

Вы также можете использовать только:

var someList = new List<SomeType>();
someList.AddRange(anotherList.Where(somePredicate));

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

TLDR: еще нет.

Команда планирует внедрить в язык функциональность, которая будет заниматься именно этим. Это будет выглядеть примерно так:

someList.Add(anotherList.Find(somePredicate) ?? return);

В котором ?? return проверяет, является ли первый аргумент нулевым, и если это так, то он возвращает. (Или вы можете написать break, если это то, что вы хотите)

Я не уверен, работают ли они над этим в данный момент, и будет ли он включен в следующую версию C#, но будет ли это иметь большое значение, если это произойдет.

Другие вопросы по тегам