پشتیبانی از ریاضیات جنریک در C# 11
در C# 11، امکان انجام عملیات ریاضی بر روی نوعهای جنریک میسر شدهاست که قسمتی از آنرا در مطلب جاری مطالعه کردید. این ویژگی به همراه دو مزیت زیر است:
- اکنون اعضای استاتیک اینترفیسها میتوانند abstract هم باشند؛ یعنی کلاسهای پیاده ساز آنها باید این اعضای استاتیک را پیاده سازی کنند.
- امکان تعریف عملگرهای استاتیک ریاضی در اینترفیسها ممکن شدهاست:
static T Add<T>(T left, T right) where T : INumber<T> => left + right;
در این مثال، نوع T، تنها میتواند از نوع <INumber<T باشد که یکی از اینترفیسهای جدید NET 7. است. این اینترفیس نیز پیاده سازی کنندهی IAdditionOperators است که در آن امکان دسترسی به عملگر + وجود دارد. متد فوق را میتوان تقریبا توسط تمام نوعهای ریاضی توکار دات نت مورد استفاده قرار داد؛ از این جهت که تعاریف آنها نیز در دات نت 7 برای پشتیبانی از INumber بهروز رسانی شدهاند.
یکی از مهمترین مزیتهای چنین امکانی، کاهش تعداد overload هایی است که باید توسعه دهندگان کتابخانهها برای پشتیبانی از انواع و اقسام نوعهای ریاضی ارائه دهند.
تغییرات API دات نت 7 در جهت پشتیبانی از ریاضیات جنریک
در مطلب جاری با اینترفیس جدید INumber آشنا شدیم که توسط آن مفاهیمی مانند صفر و یک و همچنین سربارگذاری عملگرهای ریاضی میسر شدهاست. تعداد این اینترفیسهای توکار در دات نت 7، فراتر از یک مورد فوق است. برای مثال اینترفیس جدید IMinMaxValue امکان دسترسی به T.MinValue و T.MaxValue را میسر میکند.
یک مثال: امضای نوع Int32 در دات نت 7 به صورت زیر در آمدهاست:
public readonly struct Int32 :
IComparable,
IComparable<int>,
IConvertible,
IEquatable<int>,
IFormattable,
IParsable<int>,
ISpanFormattable,
ISpanParsable<int>,
IAdditionOperators<int, int, int>,
IAdditiveIdentity<int, int>,
IBinaryInteger<int>,
IBinaryNumber<int>,
IBitwiseOperators<int, int, int>,
IComparisonOperators<int, int, bool>,
IEqualityOperators<int, int, bool>,
IDecrementOperators<int>,
IDivisionOperators<int, int, int>,
IIncrementOperators<int>,
IModulusOperators<int, int, int>,
IMultiplicativeIdentity<int, int>,
IMultiplyOperators<int, int, int>,
INumber<int>,
INumberBase<int>,
ISubtractionOperators<int, int, int>,
IUnaryNegationOperators<int, int>,
IUnaryPlusOperators<int, int>,
IShiftOperators<int, int, int>,
IMinMaxValue<int>,
ISignedNumber<int>
یعنی تمام نوعهای ریاضی توکار دات نت 7 از ریاضیات جنریک پشتیبانی میکنند. البته نوعها زیر هنوز از یک چنین پشتیبانی برخوردار نیستند:
- System.Half
- System.Numerics.BigInteger
- System.Numerics.Complex
- System.Runtime.InteropServices.NFloat
- System.Int128
- System.UInt128
نوعهای Int128 و UIn128 جزو تازههای دات نت 7 هستند (128-bit signed integer و 128-bit unsigned integer).
البته عموم ما از همان اینترفیس INumber و IBinaryInteger استفاده خواهیم کرد که خود آن نیز به صورت زیر تعریف شدهاست:
public interface INumber<TSelf> :
IComparable,
IComparable<TSelf>,
IEquatable<TSelf>,
IFormattable,
IParsable<TSelf>,
ISpanFormattable,
ISpanParsable<TSelf>,
IAdditionOperators<TSelf, TSelf, TSelf>,
IAdditiveIdentity<TSelf, TSelf>,
IComparisonOperators<TSelf, TSelf, bool>,
IEqualityOperators<TSelf, TSelf, bool>,
IDecrementOperators<TSelf>,
IDivisionOperators<TSelf, TSelf, TSelf>,
IIncrementOperators<TSelf>,
IModulusOperators<TSelf, TSelf, TSelf>,
IMultiplicativeIdentity<TSelf, TSelf>,
IMultiplyOperators<TSelf, TSelf, TSelf>,
INumberBase<TSelf>,
ISubtractionOperators<TSelf, TSelf, TSelf>,
IUnaryNegationOperators<TSelf, TSelf>,
IUnaryPlusOperators<TSelf, TSelf> where TSelf : INumber<TSelf>?