.NET Разработчик
6.53K subscribers
442 photos
3 videos
14 files
2.12K links
Дневник сертифицированного .NET разработчика. Заметки, советы, новости из мира .NET и C#.

Для связи: @SBenzenko

Поддержать канал:
- https://boosty.to/netdeveloperdiary
- https://patreon.com/user?u=52551826
- https://pay.cloudtips.ru/p/70df3b3b
Download Telegram
День 1295. #ЧтоНовенького #CSharp11
Обзор Новинок C# 11. Начало
C# 11 должен выйти ноябре 2022 года вместе с .NET 7. Рассмотрим новые функции, которые обещают выпустить в новой версии языка.
Эти функции все ещё находятся в стадии превью и, возможно, не все войдут в окончательный выпуск C# 11.

Попробовать новые функции можно в Visual Studio 2022 (версия 17.3.0 или выше). Также необходимо загрузить .NET 7 SDK (версия 7.0.0 preview 6 или выше). Кроме того, в функциях предварительного просмотра IDE нужно включить Use previews of the .NET SDK (Предварительный просмотр .NET SDK).

1. Обязательные члены
Модификатор required можно использовать для свойства, чтобы убедиться, что мы явно устанавливаем значение при инициализации объекта.
public class RequiredMember
{
public required string Name { get; set; }
}

Когда мы инициализируем объект, мы должны убедиться, что мы установили значение для этого свойства. В противном случае будет выдана ошибка компиляции:
var requiredMember = new RequiredMember { Name = "Dave" };

Также возможно установить обязательный член внутри конструктора объекта. Однако мы должны добавить атрибут. Если мы просто установим требуемое свойство через параметр, это вызовет ошибку компиляции при вызове такого конструктора. Нужно установить атрибут [SetsRequiredMembers] над конструктором. Это сообщает компилятору, что мы устанавливаем необходимые элементы внутри конструктора:
public class RequiredMember
{
public required string Name { get; set; }

[SetsRequiredMembers]
public RequiredMember(string name)
{
Name = name;
}
}
Что интересно, установка атрибута отменяет требование собственно установки значения свойства, и ошибки при этом не возникнет.

2. Структуры со значениями по умолчанию
В C# 10 нам приходилось явно устанавливать значения по умолчанию для каждого из его членов при добавлении в структуру конструктора:
public struct AutoDefaultStruct
{
public int Number { get; set; }
public AutoDefaultStruct()
{
Number = 0;
}
}
Если бы мы не установили свойство Number в конструкторе, это вызвало бы ошибку компиляции. В C# 11 если эти элементы не заданы в конструкторе, для них будут установлены значения по умолчанию. В данном случае для Number будет установлено значение 0.

3. Необработанные строковые литералы
Использование строк, содержащих кавычки, или ссылки на фрагменты кода, такие как JSON, стало намного проще. Раньше приходилось экранировать кавычки обратной косой чертой.

Необработанные строковые литералы начинаются и заканчиваются тремя кавычками """...""". Теперь кавычки теперь будут рассматриваться как часть строки.

Также можно интерполировать с помощью знака $. Количество знаков $, предваряемых строкой, представляет собой количество фигурных скобок, необходимых для ссылки на переменную:
public class RawStringLiteral
{
public static int MyNumber = 1;

public string MyJsonString =
$$"""
{
"number": "{{MyNumber}}"
}
""";
}
В примере выше использованы два знака $ в начале, поэтому нужно включить две фигурные скобки, чтобы указать переменную, на которую мы хотим сослаться.

Окончание следует…

Источник:
https://www.roundthecode.com/dotnet/c-sharp-11-preview-features-dotnet-7
👍10
День 1296. #ЧтоНовенького #CSharp11
Обзор Новинок C# 11. Окончание
Начало

4. Обобщённые атрибуты
До C# 11 передача типа в атрибут требовала параметра типа Type и передачи значения через typeof
[MyAttr(typeof(string))] 

Теперь можно делать обобщённые атрибуты:
public class MyAttr<T> : Attribute { } 

[MyAttr<string>]

Единственное ограничение, что это должен быть полностью сконструированный тип. Попытка использовать в атрибуте параметр типа обобщённого класса приведёт к ошибке компиляции:
public class MyAttr<T> : Attribute { }

public class MyClass<T>
{
[MyAttr<T>] // Ошибка компиляции
public MyClass()
{
}
}

5. Шаблоны списков
Шаблоны списков позволяют сопоставлять шаблоны для элементов массива или списка. Здесь у нас есть несколько вариантов.

При явном указании значений массив должен будет строго соответствовать шаблону:
public bool Is_1_3_5(int[] numbers)
{
return numbers is [1, 3, 5];
// numbers должен быть длиной 3
// и иметь элементы 1, 3 и 5
}

Символ пустой переменной _ соответствует единичному элементу с любым значением:
numbers is [1, _, 5]; 
// numbers должен быть длиной 3
// и иметь элементы 1, <любое целое число> и 5

Две точки .. будут соответствовать 0 или более элементов:
numbers is [1, .., 5]; 
// numbers может быть любой длины
// должен начинаться с 1 и заканчиваться 5

Также можно указать, что значение может быть больше или меньше определённого:
numbers is [1, .., >=5]; 
// numbers может быть любой длины
// должен начинаться с 1
// и заканчиваться числом не меньше 5

Как видите, шаблоны дают нам множество вариантов проверки элементов списка или массива.

Источник: https://www.roundthecode.com/dotnet/c-sharp-11-preview-features-dotnet-7
👍13
День 1447. #CSharp11
Обзор Новых Функций C# 11. Начало
Я уже ранее кратко описывал, какие новинки должны были появиться, а потом и появились в C# 11. В этой серии подведём итоги. Что же появилось, а что нет.

1. Необработанные (raw) строковые литералы (включено в релиз)
С обычными строками в C# бывает трудно работать, потому что нужно экранировать кавычки ("), обратную косую черту (\) и разрывы строк (\n). В предыдущих версиях C# уже было решение — дословные (verbatim) строки, которые начинаются с @ и допускают использование специальных символов.
Вместо:
string path = "c:\\myfilepath\\with-backslashes";
будет:
string path = @"c:\myfilepath\with-backslashes";

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

C# 11 вводит необработанные строковые литералы, чтобы обойти проблему экранирования. Используется новый разделитель — ряд кавычек, за которыми следует разрыв строки (в начале), и разрыв строки, за которым следует такое же количество кавычек (в конце). Вы просто вставляете свой блок кода или разметку между ними:
string xml = """
<part number="1976">
<name>Windscreen Wiper</name>
<description>The Windscreen wiper automatically removes
rain from your windscreen. It has a rubber
<ref part="1977">blade</ref>, which can be ordered
separately.
</description>
</part>
""";

Если вы обеспокоены тем, что внутри вашей строки может появиться последовательность из трёх двойных кавычек, можно изменить разделитель и использовать столько кавычек, сколько нужно, только одинаковое количество в начале и в конце:
string xml = """" 
Теперь можно использовать """ в строке.
"""";

Как и в случае с дословными строками, в необработанной строке сохраняются разрывы строк и пробелы. Но есть одно исключение. Общие пробелы — количество, которое используется для выравнивания всего текста — обрезаются. Это означает, что в первом примере обрежутся первые 2 пробела во всех строках.

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

Также можно использовать интерполяцию с помощью знака $. Количество знаков $ в разделителе должно быть равно количеству фигурных скобок, необходимых для ссылки на переменную:
int number = 1;
string json =
$$"""
{
"number": "{{number}}"
}
""";
В примере выше использованы два знака $ в начале, поэтому нужно включить две фигурные скобки, чтобы указать переменную, на которую мы хотим сослаться.
Не беспокойтесь запутаться в пробелах и скобках. IDE в большинстве случаев подсветят интерполированные переменные или сообщат вам об ошибке в синтаксисе.

Продолжение следует…

Источник:
https://medium.com/young-coder/a-mostly-complete-guide-to-c-11s-final-features-d43e6c9aa727
👍27