Есть ли синтаксический сахар для переписывания конструкции в одну строку в C#?
Что проверяют
Насколько вы знаете современный C#, а не версию десятилетней давности. Сахар легко перечислить, поэтому следом просят объяснить, во что конструкция разворачивается, или находят случай, где короткая запись ведёт себя не так, как длинная.
Как отвечать
Да, и много. Сгруппируйте по задачам:
- условия и null: тернарный
?:, объединение??, присваивание??=(C# 8), null-условный доступobj?.Propиarr?[0]. Плюс throw-выражения:_name = name ?? throw new ArgumentNullException(nameof(name));; - члены с телом-выражением:
public int Area => Width * Height;работает для методов, свойств, конструкторов и индексаторов; - сопоставление с образцом:
switch-выражение вместоswitchсbreak, проверки видаobj is Order { Total: > 0 }иis not null; - создание объектов: инициализаторы
new Person { Name = "Ann" }, target-typednew()(C# 9), записиrecord Person(string Name, int Age);с равенством по значению, первичные конструкторы у классов и выражения коллекцийint[] xs = [1, 2, 3];(C# 12); - прочее: интерполяция строк, деконструкция кортежей (обмен
(a, b) = (b, a);), объявлениеusing var stream = ...;без лишней вложенности, file-scoped namespace.
Хорошо добавить, что LINQ в синтаксисе запросов (from x in xs where ...) тоже сахар: компилятор переписывает его в вызовы Where и Select.
Где спотыкаются
Путают public List<int> Items => new(); и public List<int> Items { get; } = new();. Первое создаёт новый список при каждом обращении, второе один раз при создании объекта, и элементы, добавленные в первом случае, просто теряются.
Вкладывают тернарные операторы друг в друга. Одна строка вместо восьми не делает код лучше, если её нельзя прочитать с первого раза.
Расставляют ?. везде, чтобы не падать на null. Ошибка не исчезает, а переезжает дальше по коду, где причину уже не найти. К тому же ?. у значимого типа возвращает Nullable<T>, и тип выражения меняется.