Чтобы включить новые возможности нужно кликнуть правой кнопкой мышкой по имени проекту и выбрать свойства. В разделе Build/General в Target Framework выбрать .NET 5.
Раньше для создания простой программы Hallo World нужно было создать класс, в классе создать статичный метод и в нем уже выводить данные в консоль. Сложно, больно. Когда мне нужно было рассказать про основы C#, то приходилось постоянно говорить – не обращайте внимание, что такое класс, что такое метод, мы потом все это рассмотрим. Теперь Hallo World выглядит банально в две строки:
using System; Console.WriteLine("Hallo");
Сохраняем все это в файле Program.cs и запускаем. Объяснить результат так же не сложно - подключаем System, чтобы получить доступ к консоли и выводим строку.
В девятой версии C# появилась возможность защищать свойства от изменения. Очень часто свойства должны инициализироваться только при создании объекта и потом оставаться неизменными и вот тут нам помогает новый модификатор доступа init. Надеюсь я правильно сказал на русском модификатор доступа, потому что в английском это accessor.
Сейчас, когда мы объявляем свойство, мы можем указать два варианта set и/или get.
class Person { public string FirstName { get; init; } public string LastName { get; init; } }
Теперь следующий код завершиться ошибкой компиляции:
Person p = new Person(); p.FirstName = firstname; p.LastName = lastname;
Свойства FirstName и LastName менять нельзя, их можно читать в любое время, с значения нужно задавать только во время инициализации:
Person p = new Person() { FirstName = firstname, LastName = lastname };
Я бы по умолчанию делал все свойства теперь как init и использовал set только в том случае, когда это действительно нужно.
Я в разделе плюс писал об огромной разнице ссылочных типов и значений на примере структур, эту статью молжно прочитать здесь: Значимые типы в C# на примере структур. Если вы не знаете отличие структур о классов, то очень рекомендую прочитать.
В .NET 5 вводят новое понятие – запись или record. Это все еще классы, которые являются ссылочными типами, но они все же ведут себя с данными, как структуры.
class Person { public string FirstName { get; set; } public string LastName { get; set; } } class Program { static void Main(string[] args) { Person p1 = new Person() { FirstName = "Mikhail", LastName = "Flenov" }; Person p2 = new Person() { FirstName = "Mikhail", LastName = "Flenov" }; Console.WriteLine("p1 == p2 " + p1.Equals(p2)); } }
Так как Person является классом, то для него память будет выделена в куче. Мы создаем две переменные и пытаемся сравнить их. Несмотря на то, что все поля переменных одинаковы, это два разных объекта объекта, поэтому результатом сравнения будет false.
Но стоит нам поменять class на record и результатом будет уже true, как и в случае с структурами. В отличии от структур record является ссылочным типом и для него память выделяется в куче, но в отличие от классов записи сравниваются по значению всех свойств.
Значение записей менять нельзя, если мы хотим что-то поменять, нужно создавать копию с изменением. Чтобы проще было создавать копии и не нужно было копировать все вручную, придумали новую конструкцию
Person p2 = p1 with { изменения }
p1 – это запись. with говорит о том, что нужно скопировать все поля p1, наложить и зменения в фигурных скобках и сохранить результат в p2. В результате будет создана новая запись p2 с изменениями.
record Person { public string FirstName { get; init; } public string LastName { get; init; } } class Program { static void Main(string[] args) { Person p1 = new Person() { FirstName = "Mikhail", LastName = "Flenov" }; Person p2 = p1 with { FirstName = "Michael" }; Console.WriteLine(String.Format("p1.Firstname {0} p1.LastName {1}", p1.FirstName, p1.LastName)); Console.WriteLine(String.Format("p2.Firstname {0} p1.LastName {1}", p2.FirstName, p2.LastName)); } }
В результате в консоли мы должны увидеть что-то типа:
p1.Firstname Mikhail p1.LastName Flenov p2.Firstname Michael p1.LastName Flenov
Внимание!!! Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание
Паника, что-то случилось!!! Ничего не найдено в комментариях. Срочно нужно что-то добавить, чтобы это место не оставалось пустым.
Добавить Комментарий