Поиск по сайту:

Что нового в C# 10?


C# 10 был выпущен в ноябре 2021 года вместе с Visual Studio 2022 и .NET 6. Он добавляет несколько новых функций, упрощающих и упрощающих работу. Вот обзор некоторых из наиболее полезных дополнений и того, как они улучшат ваш рабочий процесс.

Пространства имен с файловой областью

Начнем с одного из самых простых, но, пожалуй, самых значительных изменений. Теперь вы можете применить пространство имен ко всему файлу с помощью новой опции синтаксиса для ключевого слова namespace. Оставшийся код внутри файла будет автоматически помещен в пространство имен, даже если он не имеет отступа внутри блока namespace. Это работает аналогично объявлениям пространств имен в PHP.

В C# 9 вам нужен был этот код для пространства имен класса:

namespace Demo {
 
    public class Example {
    }
 
}

В C# 10 вместо этого можно использовать следующее:

namespace Demo;
 
public class Example {
}

Это сэкономит вам некоторое пространство по горизонтали в вашем редакторе, вырезав уровень отступа. Если файл должен содержать несколько классов, вы можете записать их все, начиная с нулевого столбца — объявление namespace применяется ко всему файлу.

Глобальное использование

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

В C# 10 это изменено для поддержки варианта глобального использования. Это сделает указанное пространство имен доступным для всех файлов вашего проекта.

global using System;

Глобальное использование может быть добавлено к любому файлу, который будет включен в вашу компиляцию. Они поддерживают все функции стандартных операторов using, включая ключевое слово static и псевдонимы с =.

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

Дополнительным свойством глобального использования является неявное использование. Это автоматически создает операторы global using, соответствующие типу вашего проекта. Эта возможность включена по умолчанию в шаблонах проектов .NET 6. Его можно отключить с помощью параметра ImplicitUsings в файле .csproj.

Улучшенные структуры

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

public record Point(int X, int Y);

В этом примере создается «позиционная» структура записи, в которой параметры конструктора X и Y становятся неявными открытыми членами. Вы также можете вручную определить элементы, используя существующий синтаксис:

public record struct Point {
    public int X { get; init; }
    public int Y { get; init; }
}

Структуру записи следует использовать в сценариях, где вам нужно инкапсулировать некоторые данные, не добавляя настраиваемое поведение в качестве методов класса. Структура записи предлагает встроенные проверки равенства значений и такие функции, как ToString(). Он может быть как изменяемым, так и неизменяемым с помощью ключевого слова readonly.

Усовершенствования лямбда-выражения

В C# 10 добавлено несколько улучшений лямбда-выражений, касающихся их типов и синтаксиса. Цель состоит в том, чтобы сделать лямбда-выражения более похожими на обычные методы и локальные функции. Определение одного теперь будет более знакомым опытом.

Введено понятие «естественного» типа. Это позволяет компилятору определить тип лямбда-выражения без ручного преобразования его в делегат или выражение. Это создает более читаемый код при присвоении лямбда переменной:

// C# 9
Func<string, int> toInt = (string s) => int.Parse(s);
 
// C# 10
var toInt = (string s) => int.Parse(s)

Компилятор определит тип toInt как Func, и это будет отображаться при просмотре кода в Visual Studio. Выводы будут использовать Func, Action или синтезированные делегаты.

Естественные типы будут работать только тогда, когда ваше лямбда-выражение уже полностью типизировано. Если вы опустите типы параметров, компилятор не сможет создать определение совместимого типа.

Связанным изменением является поддержка явных типов возврата. Как и в случае с обычной функцией, возвращаемый тип идет перед списком параметров лямбды:

var toInt = int (string s) => int.Parse(s)

Наконец, лямбда-выражения теперь могут принимать атрибуты так же, как методы и функции. Они располагаются в начале лямбда-выражения перед типом возвращаемого значения и списком параметров. Вы можете использовать атрибуты, чтобы прикрепить дополнительные метаданные к своим лямбда-выражениям, чтобы упростить самоанализ и анализ кода.

var toInt = [DemoAttribute()] int (string s) => int.Parse(s)

Универсальные деконструированные задания

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

В C# 9 это привело к следующему коду:

int x = 0;
int y = 0;
(x, y) = point;
 
(int z) = point;

В то время как в С# 10 вы можете сделать это:

int x = 0;
int y = 0;
(x, y, int z) = point;

Теперь x, y и z будут инициализированы значениями с использованием единственного присваивания деконструкции, что уменьшит количество повторений в вашем коде.

Другие изменения

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

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

// C# 9
{ Train: {ArrivalTime: "10:00"} }
 
// C# 10
{ Train.ArrivalTime: "10:00" }

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

Заключение

В C# 10 добавлено несколько новых возможностей, которые помогут упростить разработку. Однако многие другие новые функции, включая ключевое слово field и обязательные свойства, были перенесены в следующую основную версию. Общие атрибуты и статические абстрактные элементы для интерфейсов превратились в 10, но с прикрепленным тегом предварительного просмотра.

Вы можете начать использовать C# 10 уже сегодня, загрузив Visual Studio 2022. Этот язык также доступен как часть автономного пакета SDK для .NET 6, который работает в Windows, Mac и Linux.




Все права защищены. © Linux-Console.net • 2019-2024