C # находится на пути к своему третьему десятилетию жизни. Первоначально выпущенный в 2000 году, язык расширился и изменился в 9 основных версиях. Когда-то это была подделка Java во всех смыслах, но во многих аспектах это имя резко выросло.

На протяжении всей его жизни количество выпусков заменяющих версий языка было высоким, включая выпуски последних версий Visual Studio, также как и выпуски среды выполнения .NET. Эта комбинация фактически снизила скорость инноваций.

Предлагаемые функции C # 9:

1. Заявления верхнего уровня

Заявления верхнего уровня удаляют ненужные церемонии из многих приложений.

Написание простой программы на C # требует значительного количества шаблонного кода. Рассмотрим каноническое «Hello World!» программа.

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

Мы могли бы задаться вопросом, как это работает без сигнатур классов и методов [пространство имен необязательно] и как .NET framework определяет точку входа. Что ж, C # 9 делает следующее: если у нас есть файл класса с оператором верхнего уровня, то предполагается, что он является точкой входа в приложение. Операторы верхнего уровня отлично подходят для небольших консольных программ, фрагментов кода и утилит. Это упрощает жизнь.

Спецификация:

Программа должна выполняться после использования и до объявления любого типа или пространства имен в файле, операторы верхнего уровня должны быть доступны только в одном файле внутри проекта, так же как у вас может быть только один метод Main. Если вы хотите вернуть код состояния, вы можете это сделать. Если вы хотите дождаться вещей, вы можете это сделать. И если вы хотите получить доступ к аргументам командной строки, args существует как «волшебный» параметр.

Локальные функции представляют собой некоторую форму операторов и также разрешены в программе верхнего уровня. Было бы ошибкой вызывать их из любого места за пределами секции операторов верхнего уровня.

2. Только инициализирующие сеттеры

В этом типе продукта есть ProductId, ProductName и FixedPrice с методами доступа как для получения, так и для установки, и проблема здесь в том, что объект является изменяемым. Это означает, что после создания объекта мы можем изменить значения, как показано ниже:

Чтобы сделать это неизменным, мы можем это сделать с помощью конструктора.

В приведенном выше коде для его поддержки требуется значительный объем кода котла. Именно в этом проявляется новая функция C # 9 установщик только для инициализации. Вместо Set мы можем использовать ключевое слово init. Это делает его неизменным или только для чтения. Если мы попытаемся изменить, когда свойство инициализировано, оно не позволит этого, компилятор выдаст ошибку. И это большое изменение, которое может избавить от большого количества шаблонного кода.

3. Записи

Записи определяют неизменяемый ссылочный тип и ведут себя как тип значения. После определения записи мы не можем изменять значения каких-либо свойств экземпляров записи.

Чтобы сделать весь объект неизменяемым, необходимо определить ключевое слово init для каждого свойства в случае использования неявных конструкторов без параметров.

Члены являются общедоступными в записях, если вы не уточняете их. Записи представляют собой общедоступное автоматическое свойство только для инициализации, которое является сокращением предыдущего объявления:

Записи поддерживают наследование. Вы можете сообщить о новой записи, полученной от Лица, как показано ниже, и вы также можете запечатать записи, чтобы избежать дальнейшего создания.

По умолчанию обычные классы равны, если они лежат в основе ссылки. Его поведение изменится, если вы объявите свой класс как запись. В отличие от сравнения ссылки на объект, записи сравниваются по значению. Это означает, что два разных объекта с одинаковыми значениями будут считаться равными и hashCode будет одинаковым. Контент сможет определять записи, а не по личности.

Позиционные рекорды

Имеет смысл принять более позиционный подход к записи, и ее содержимое задается через аргументы конструктора и может быть извлечено с помощью позиционной деконструкции. Вполне возможно определить свой собственный конструктор и деконструктор в записи:

Но синтаксис намного короче, чтобы выразить то же самое.

Это объявляет общедоступные автоматические свойства только для инициализации и конструктор и деконструктор, чтобы вы могли написать:

В случае свойства auto, владейте этим же именем свойства на месте, и сгенерированный конструктор и деконструктор будут просто использовать его. Если это так, параметр используется для инициализации. Предположим, например, что вы предпочли бы видеть FirstName как защищенное свойство:

Позиционная запись может вызывать базовый конструктор следующим образом:

С выражением

При работе с неизменяемыми данными наиболее распространенной задачей является создание нового значения из существующего значения для представления нового состояния, и это называется неразрушающей мутацией. Теперь поговорим о «С выражениями». Мы можем определить несколько свойств, используя С выражением. «с выражением» вызывает конструктор копирования, а затем применяет инициализатор объекта вверху, чтобы соответствующим образом изменить свойства. Давайте рассмотрим особенность,

Теперь все в порядке. Предположим, что запись студента состоит из 40 свойств. Использовать описанный выше метод - не лучшая идея. Потому что здесь задействовано много кода. Из более ранней версии с помощью конструктора копирования новый объект может быть создан с использованием как старых, так и новых свойств объекта в соответствии с запросом. Теперь с этим можно справиться намного эффективнее, используя нашу новую функцию C # 9 ‘with expression’ следующим образом: мы получим тот же результат.

4. Улучшенное сопоставление с образцом

Сопоставление с образцом было введено в C # и с тех пор претерпело значительные изменения. Последнее улучшение C # было весьма захватывающим. Сопоставление с образцом позволяет разработчику сопоставлять значение (или объект) с определенными образцами, чтобы выбрать ветвь / блок кода.

Шаблоны отношений

C # 9 позволяет использовать реляционный шаблон, который позволяет использовать ‹,›, ‹= и › = в таких шаблонах:

Что у нас есть сейчас

Прежде всего, представьте себе перетаскивание в C # 8, которое мы всегда должны быть готовы разрешить с помощью соответствия реляционного шаблона в C # 9, чтобы мы действительно увидит власть.

Возьмем следующий код:

Как мы могли это улучшить? Что ж, мы все еще можем использовать If / Else сверху в большинстве случаев только для его простоты. Но мы могли бы использовать сопоставление шаблонов, представленное в C # 7, с оператором switch. Это будет выглядеть так:

Неплохо, правда? Но на самом деле мы ничего не добавляем в операторы If / Else, на самом деле мы добавили сюда еще больше кода. Если бы мы использовали C # 8, мы могли бы использовать Switch Expressions. Это было бы так:

Логические шаблоны && Соответствие реляционных шаблонов в операторах / выражениях Switch

C # 9 позволяет использовать логические операторы, такие как 'и', 'или' и 'not', они могут даже в сочетании с такими реляционными шаблонами, и мы все еще можем улучшить приведенный выше код следующим образом:

5. Типизированные "новые" выражения

Мы можем опустить тип в «новом выражении», если созданный объект уже известен.

Вывод:

Мы знаем, что приведенный выше синтаксис доступен в более ранней версии C #. Выражения new в C # всегда требовали указания типа (за исключением неявно типизированных выражений массива). В C # -9 нам не нужно указывать тип записи в имени класса для нового выражение. Давайте обновим приведенный выше код, как показано ниже, и мы получим тот же результат.

Чаще всего эта функция используется при определении объявлений полей. Это часто бывает особенно приятно, когда у вас много повторений, например, в массиве или инициализаторе объекта:

Автор: Мукеш Каннан Г.