День 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