پشتیبانی از ریاضیات جنریک در C# 11
در C# 11، امکان انجام عملیات ریاضی بر روی نوعهای جنریک میسر شدهاست که قسمتی از آنرا در مطلب جاری مطالعه کردید. این ویژگی به همراه دو مزیت زیر است:
- اکنون اعضای استاتیک اینترفیسها میتوانند abstract هم باشند؛ یعنی کلاسهای پیاده ساز آنها باید این اعضای استاتیک را پیاده سازی کنند.
- امکان تعریف عملگرهای استاتیک ریاضی در اینترفیسها ممکن شدهاست:
در این مثال، نوع T، تنها میتواند از نوع <INumber<T باشد که یکی از اینترفیسهای جدید NET 7. است. این اینترفیس نیز پیاده سازی کنندهی IAdditionOperators است که در آن امکان دسترسی به عملگر + وجود دارد. متد فوق را میتوان تقریبا توسط تمام نوعهای ریاضی توکار دات نت مورد استفاده قرار داد؛ از این جهت که تعاریف آنها نیز در دات نت 7 برای پشتیبانی از INumber بهروز رسانی شدهاند.
یکی از مهمترین مزیتهای چنین امکانی، کاهش تعداد overload هایی است که باید توسعه دهندگان کتابخانهها برای پشتیبانی از انواع و اقسام نوعهای ریاضی ارائه دهند.
تغییرات API دات نت 7 در جهت پشتیبانی از ریاضیات جنریک
در مطلب جاری با اینترفیس جدید INumber آشنا شدیم که توسط آن مفاهیمی مانند صفر و یک و همچنین سربارگذاری عملگرهای ریاضی میسر شدهاست. تعداد این اینترفیسهای توکار در دات نت 7، فراتر از یک مورد فوق است. برای مثال اینترفیس جدید IMinMaxValue امکان دسترسی به T.MinValue و T.MaxValue را میسر میکند.
یک مثال: امضای نوع Int32 در دات نت 7 به صورت زیر در آمدهاست:
یعنی تمام نوعهای ریاضی توکار دات نت 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 استفاده خواهیم کرد که خود آن نیز به صورت زیر تعریف شدهاست:
در C# 11، امکان انجام عملیات ریاضی بر روی نوعهای جنریک میسر شدهاست که قسمتی از آنرا در مطلب جاری مطالعه کردید. این ویژگی به همراه دو مزیت زیر است:
- اکنون اعضای استاتیک اینترفیسها میتوانند abstract هم باشند؛ یعنی کلاسهای پیاده ساز آنها باید این اعضای استاتیک را پیاده سازی کنند.
- امکان تعریف عملگرهای استاتیک ریاضی در اینترفیسها ممکن شدهاست:
static T Add<T>(T left, T right) where T : INumber<T> => left + right;
یکی از مهمترین مزیتهای چنین امکانی، کاهش تعداد 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>
- 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>?