TG Telegram Group & Channel
.NET Разработчик | United States America (US)
Create: Update:

День 1537. #ЧтоНовенького
Новые Функции C#12. Начало
В недавно выпущенном превью 3 .NET 8 добавили несколько интересных новых функций C#.

1. Первичные конструкторы для классов и структур
Первичные конструкторы были введены для записей в C#9. C#12 распространяет их на все классы и структуры:

public class Student
(int id, string name, IEnumerable<decimal> grades)
{
public Student(int id, string name)
: this(id, name, Enumerable.Empty<decimal>()) { }

public int Id => id;
public string Name { get; set; }
= name.Trim();
public decimal GPA =>
grades.Any() ? grades.Average() : 4.0m;
}

Параметры первичного конструктора в классе Student доступны во всём теле класса. Один из способов их использования — инициализация свойств. В отличие от записей, свойства не создаются автоматически для параметров первичного конструктора в классах и структурах. Это отражает тот факт, что классы и структуры часто более сложны, чем записи, и объединяют как данные, так и поведение. В результате им часто требуются параметры конструктора, которые не следует раскрывать. Явное создание свойств делает очевидным, какие данные предоставляются в соответствии с обычным использованием классов. Первичные конструкторы помогают избежать шаблонного объявления закрытых полей и наличия тривиальных тел конструкторов, назначающих значения параметров этим полям.

Когда параметры первичного конструктора используются в методах или средствах доступа к свойствам (параметр grades в классе Student выше), их необходимо захватить, чтобы они оставались доступными после завершения выполнения конструктора. Это похоже на то, как параметры и локальные переменные захватываются в лямбда-выражениях. Для параметров первичного конструктора захват реализуется путём создания приватного резервного поля в классе или структуре. Поле имеет «непроизносимое» имя, что означает, что оно не будет конфликтовать с другими именами и не будет очевидно при использовании рефлексии. Подумайте, как назначать и использовать параметры первичного конструктора, чтобы избежать двойного хранения данных. Например, name используется для инициализации автоматического свойства Name, которое имеет собственное резервное поле. Если бы другой член напрямую ссылался на параметр name, оно также сохранялось бы в собственном резервном поле, что приводило к ненужному дублированию.

Класс с первичным конструктором может иметь дополнительные конструкторы. Дополнительные конструкторы должны использовать инициализатор this(…) для вызова другого конструктора того же класса или структуры. Это гарантирует, что первичный конструктор всегда вызывается и все данные, необходимые для создания класса, присутствуют. Структуры всегда имеют конструктор без параметров. Неявный конструктор без параметров не будет использовать инициализатор this() для вызова первичного конструктора. Поэтому для структур вы должны написать явный конструктор без параметров, если хотите, чтобы вызывался первичный конструктор.

Вы можете оставить отзыв о первичных конструкторах на GitHub в обсуждении Preview Feedback: C# 12 Primary constructors.

Чтобы попробовать новые функции, загрузите последнюю превью версию Visual Studio 17.6 или превью 3 .NET 8.

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

Источник:
https://devblogs.microsoft.com/dotnet/check-out-csharp-12-preview/

День 1537. #ЧтоНовенького
Новые Функции C#12. Начало
В недавно выпущенном превью 3 .NET 8 добавили несколько интересных новых функций C#.

1. Первичные конструкторы для классов и структур
Первичные конструкторы были введены для записей в C#9. C#12 распространяет их на все классы и структуры:
public class Student
(int id, string name, IEnumerable<decimal> grades)
{
public Student(int id, string name)
: this(id, name, Enumerable.Empty<decimal>()) { }

public int Id => id;
public string Name { get; set; }
= name.Trim();
public decimal GPA =>
grades.Any() ? grades.Average() : 4.0m;
}

Параметры первичного конструктора в классе Student доступны во всём теле класса. Один из способов их использования — инициализация свойств. В отличие от записей, свойства не создаются автоматически для параметров первичного конструктора в классах и структурах. Это отражает тот факт, что классы и структуры часто более сложны, чем записи, и объединяют как данные, так и поведение. В результате им часто требуются параметры конструктора, которые не следует раскрывать. Явное создание свойств делает очевидным, какие данные предоставляются в соответствии с обычным использованием классов. Первичные конструкторы помогают избежать шаблонного объявления закрытых полей и наличия тривиальных тел конструкторов, назначающих значения параметров этим полям.

Когда параметры первичного конструктора используются в методах или средствах доступа к свойствам (параметр grades в классе Student выше), их необходимо захватить, чтобы они оставались доступными после завершения выполнения конструктора. Это похоже на то, как параметры и локальные переменные захватываются в лямбда-выражениях. Для параметров первичного конструктора захват реализуется путём создания приватного резервного поля в классе или структуре. Поле имеет «непроизносимое» имя, что означает, что оно не будет конфликтовать с другими именами и не будет очевидно при использовании рефлексии. Подумайте, как назначать и использовать параметры первичного конструктора, чтобы избежать двойного хранения данных. Например, name используется для инициализации автоматического свойства Name, которое имеет собственное резервное поле. Если бы другой член напрямую ссылался на параметр name, оно также сохранялось бы в собственном резервном поле, что приводило к ненужному дублированию.

Класс с первичным конструктором может иметь дополнительные конструкторы. Дополнительные конструкторы должны использовать инициализатор this(…) для вызова другого конструктора того же класса или структуры. Это гарантирует, что первичный конструктор всегда вызывается и все данные, необходимые для создания класса, присутствуют. Структуры всегда имеют конструктор без параметров. Неявный конструктор без параметров не будет использовать инициализатор this() для вызова первичного конструктора. Поэтому для структур вы должны написать явный конструктор без параметров, если хотите, чтобы вызывался первичный конструктор.

Вы можете оставить отзыв о первичных конструкторах на GitHub в обсуждении Preview Feedback: C# 12 Primary constructors.

Чтобы попробовать новые функции, загрузите последнюю превью версию Visual Studio 17.6 или превью 3 .NET 8.

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

Источник:
https://devblogs.microsoft.com/dotnet/check-out-csharp-12-preview/
👍11


>>Click here to continue<<

.NET Разработчик




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)