TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #1783 1.41K
День 1450. #ЗаметкиНаПолях
Обзор Новых Функций C# 11. Продолжение
Предыдущие части: 1, 2-3, 4

5. Обязательные члены (включено в релиз)
Раньше вы полагались практически исключительно на конструкторы классов, чтобы убедиться, что объекты созданы в правильном состоянии. Сегодня мы часто работаем с более легкими конструкциями, такими как автоматически реализуемые свойства в записях:
public record Employee
{
public string Name { get; init; }
public decimal Salary { get; init; }
public DateTime Hired { get; init; }
}

И когда мы создаём экземпляры таких легковесных объектов, нам нравится использовать инициализаторы:
var newGuy = new Employee
{
Name = "Dave Bowman",
Salary = 100000m,
Hired = DateTime.Now()
};

Но что, если объект не имеет смысла, когда не заданы определённые свойства? Вы можете добавить конструктор, как обычно, но придётся заплатить за эту формализацию большим количеством шаблонного кода. И ошибки при копировании значений из параметров в свойства, конечно, глупы, но их часто совершают. Ключевое слово required решает эту проблему:
public record Employee
{
public required string Name { get; init; }
public decimal Salary { get; init; }
public DateTime Hired { get; init; }
}

Теперь компилятор не позволит вам написать код, который создаёт Employee без задания свойства Name.

См. также: Подробнее об Обязательных Членах Класса в C#11

6. Параметры с проверкой на null (удалено из релиза)
Как и многие удалённые функции C#, автоматическая проверка параметра на null предлагалась и раньше, но её недостатки так и не были полностью устранены. Идея состояла в том, чтобы избавить методы от многословной проверки параметров и выброса ArgumentNullException с помощью оператора !!. И программисты тут же разделились на тех, кто был от неё в восторге, и тех, кто сразу её возненавидел. Возник вопрос: стоит ли создавать новый оператор только ради одного маленького удобства?

Идея была представлена ещё во времена C# 8. И изначально казалась прекрасной, хотя .NET 6 добавил удобный метод ArgumentNullException.ThrowIfNull(), который тоже хорошо справляется со своей задачей. Т.е. вместо:
public UpdateAddress(int id, Address address)
{
if (address == null)
{
throw new ArgumentNullException("address");
}
...
}

Вы можете написать:
public UpdateAddress(int id, Address address)
{
ArgumentNullException.ThrowIfNull(address);
...
}

Создатели языка рассмотрели первоначальные отзывы об операторе !!. Большинство из них были положительные, но не подавляющее большинство, как это обычно необходимо для функций с таким широким применением. И в итоге они решили, что лучше всего будет удалить её из релиза C# 11.

Окончание следует…

Источник:
https://medium.com/young-coder/a-mostly-complete-guide-to-c-11s-final-features-d43e6c9aa727
  • 👍 11
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →