Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 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