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

День 2269. #ЧтоНовенького #CSharp14
Члены-Расширения

Типы-расширения хотели добавить ещё в .NET 9, но что-то пошло не так, и их релиз отложили. Теперь они вышли в третьем превью .NET 10. Пока поддерживаются статические методы, свойства экземпляров и статические свойства. Поддержка будет расширена в будущих превью.

Сегодня у вас может быть метод расширения вроде следующего:

public static class Extensions
{
public static IEnumerable<int>
WhereGreaterThan(
this IEnumerable<int> source,
int threshold)
=> source.Where(x => x > threshold);
}

Расширяемый класс (интерфейс) — это параметр, которому предшествует ключевое слово this. В этом случае - source. Расширения были доступны только для методов.

C# 14 вводит блоки-расширения. Это блоки с областью действия, добавляющей классу(интерфейсу)-получателю члены, которые в ней содержатся. Метод расширения WhereGreaterThan в новом синтаксисе, а также свойство-расширения IsEmpty будут выглядеть так:
public static class Extensions
{
extension(IEnumerable<int> source)
{
public IEnumerable<int>
WhereGreaterThan(int threshold)
=> source.Where(x => x > threshold);

public bool IsEmpty
=> !source.Any();
}
}

Чтобы использовать члены-расширения, просто вызовите их:
List<int> list = [1, 2, 3, 4, 5];
var large = list.WhereGreaterThan(3);
if (large.IsEmpty)
Console.WriteLine("Нет чисел >3");
else
Console.WriteLine("Есть числа >3");

Поддерживаются дженерики, а правила разрешения такие же, как и для методов расширения. Например, можно сделать WhereGreaterThan и IsEmpty дженериками:
extension<T>(IEnumerable<T> source)
where T : INumber<T>
{
public IEnumerable<T>
WhereGreaterThan(T threshold)
=> source.Where(x => x > threshold);

public bool IsEmpty
=> !source.Any();
}

Ограничение INumber<T> позволяет нам использовать оператор «больше».

Статические методы и свойства не имеют получателя, поэтому блок-расширение может использоваться без имени параметра:
extension<T>(List<T>)
{
public static List<T> Create() => [];
}


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

В будущих превью обещают больше видов расширений. А пока можете попробовать эти и оставить отзывы в обсуждении на GitHub.

Источник: https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md#extension-members

День 2269. #ЧтоНовенького #CSharp14
Члены-Расширения

Типы-расширения хотели добавить ещё в .NET 9, но что-то пошло не так, и их релиз отложили. Теперь они вышли в третьем превью .NET 10. Пока поддерживаются статические методы, свойства экземпляров и статические свойства. Поддержка будет расширена в будущих превью.

Сегодня у вас может быть метод расширения вроде следующего:
public static class Extensions
{
public static IEnumerable<int>
WhereGreaterThan(
this IEnumerable<int> source,
int threshold)
=> source.Where(x => x > threshold);
}

Расширяемый класс (интерфейс) — это параметр, которому предшествует ключевое слово this. В этом случае - source. Расширения были доступны только для методов.

C# 14 вводит блоки-расширения. Это блоки с областью действия, добавляющей классу(интерфейсу)-получателю члены, которые в ней содержатся. Метод расширения WhereGreaterThan в новом синтаксисе, а также свойство-расширения IsEmpty будут выглядеть так:
public static class Extensions
{
extension(IEnumerable<int> source)
{
public IEnumerable<int>
WhereGreaterThan(int threshold)
=> source.Where(x => x > threshold);

public bool IsEmpty
=> !source.Any();
}
}

Чтобы использовать члены-расширения, просто вызовите их:
List<int> list = [1, 2, 3, 4, 5];
var large = list.WhereGreaterThan(3);
if (large.IsEmpty)
Console.WriteLine("Нет чисел >3");
else
Console.WriteLine("Есть числа >3");

Поддерживаются дженерики, а правила разрешения такие же, как и для методов расширения. Например, можно сделать WhereGreaterThan и IsEmpty дженериками:
extension<T>(IEnumerable<T> source)
where T : INumber<T>
{
public IEnumerable<T>
WhereGreaterThan(T threshold)
=> source.Where(x => x > threshold);

public bool IsEmpty
=> !source.Any();
}

Ограничение INumber<T> позволяет нам использовать оператор «больше».

Статические методы и свойства не имеют получателя, поэтому блок-расширение может использоваться без имени параметра:
extension<T>(List<T>)
{
public static List<T> Create() => [];
}


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

В будущих превью обещают больше видов расширений. А пока можете попробовать эти и оставить отзывы в обсуждении на GitHub.

Источник: https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md#extension-members
👍27


>>Click here to continue<<

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




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)