Превью Функции в .NET 6. Продолжение
Начало
2. Обобщённая математика
Одна из давно востребованных функций .NET - это возможность использовать операторы для обобщённых типов. Нововведение добавляет возможность писать обобщённый код относительно, например, числовых типов, на которые наложены ограничения в виде интерфейсов с нужными операторами. Таким образом, алгоритмы могут выражены в следующем виде:
// Интерфейс определяет статические свойства и операторы
interface IAddable<T> where T : IAddable<T>
{
static abstract T Zero { get; }
static abstract T operator +(T t1, T t2);
}
// Классы и структуры (включая встроенные) реализуют интерфейс
struct Int32 : …, IAddable<Int32>
{
public static Int32 operator +(Int32 x, Int32 y)
=> x + y;
public static Int32 Zero => 0;
}
// Обобщённые алгоритмы могут использовать статические члены типа Т
public static T AddAll<T>(T[] ts)
where T : IAddable<T>
{
// вызов статического свойства
T result = T.Zero;
// вызов статического оператора +
foreach (T t in ts) { result += t; }
return result;
}
Это стало возможным благодаря появлению нескольких новых статических абстрактных интерфейсов, которые соответствуют различным операторам, доступным для языка, и предоставлению нескольких других интерфейсов, представляющих обобщённые функции, такие как синтаксический анализ или обработка чисел. Интерфейсы были разработаны для расширяемости и повторного использования и поэтому обычно представляют лишь отдельные операторы или свойства. Например, в одном интерфейсе не используются парные операции, такие как умножение и деление, поскольку они подходят не для всех типов.
Matrix4x4*Matrix4x4 является допустимым, а Matrix4x4/Matrix4x4 - нет. Кроме того, интерфейсы обычно позволяют типам исходных данных и результата различаться, чтобы поддерживать такие сценарии, как double = TimeSpan/TimeSpan или Vector4 = Vector4*float.Вот некоторые из новых интерфейсов:
-
INumber – члены общие для числовых типов,-
IFloatingPoint – члены общие для чисел с плавающей точкой,-
IAdditionOperators – x+y,-
ISubtractionOperators – x–y,-
IMultiplyOperators – x*y,-
IDivisionOperators – x/y,-
IComparisonOperators – x<y, x>y, x<=y и x>=y,-
IEqualityOperators – x==y и x!=y,-
IIncrementOperators – ++x и x++.Поскольку этот функционал пока находится в превью, существуют различные аспекты, которые все ещё находятся в стадии разработки и могут измениться к следующей превью версии или после официального релиза. Также могут быть добавлены новые концепции, такие как
IConvertible<TSelf>, или интерфейсы для поддержки векторных типов и операций.Источники:
- https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/
- https://habr.com/ru/post/572902/