Новые возможности C# 9

Чтобы включить новые возможности нужно кликнуть правой кнопкой мышкой по имени проекту и выбрать свойства. В разделе 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 только в том случае, когда это действительно нужно.

Записи record

Я в разделе плюс писал об огромной разнице ссылочных типов и значений на примере структур, эту статью молжно прочитать здесь: Значимые типы в 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


Внимание!!! Если ты копируешь эту статью себе на сайт, то оставляй ссылку непосредственно на эту страницу. Спасибо за понимание

Комментарии

Паника, что-то случилось!!! Ничего не найдено в комментариях. Срочно нужно что-то добавить, чтобы это место не оставалось пустым.

Добавить Комментарий

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне