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#, но будет ли это иметь большое значение, если это произойдет.