يمكن تكييف العوامل الحسابية وعوامل المقارنة الرئيسية كي تستخدمها في أصنافك وstruct الخاصة بك. ويُعرف هذا باسم التحميل الزائد للعوامل.
يناقش هذا المقال الصياغة بالتفصيل، وكذلك العوامل التي يمكن تحميلها زيادةً وتلك التي لا يمكن.
تأخذ معظم العوامل الصيغة التالية:
static <return type> operaator <operator symbols>(<parameters>);
وتأخذ عوامل التحويل الصيغة التالية:
static (explicit|implicit) operator <cast-to-type>(<cast-from-type> <parameter name>);
تتصرّف العوامل تمامًا كما تتصرّف الطرق الساكنة.
أمثلة على الصياغة:
struct Point
{
decimal x;
decimal y;
public static bool operator ==(Point pt, Point ptOther)
{
return pt.x == ptOther.x && pt.y == ptOther.y;
}
public static bool operator !=(Point pt, Point ptOther)
{
return !(pt == ptOther);
}
public static Point operator *(Point pt, decimal scale)
{
var ptNew = new Point();
ptNew.x = pt.x * scale;
ptNew.y = pt.y * scale;
return ptNew;
}
public static implicit operator Point((decimal x, decimal y) xy)
{
var pt = new Point();
pt.x = xy.x;
pt.y = xy.y;
return pt;
}
public static explicit operator (decimal x, decimal y)(Point pt)
{
return (pt.x, pt.y);
}
}
غالبًا ما يكون من المفيد تنفيذ طريقة Equals() واستدعاؤها من العامل ==. وبالمثل، يمكنك لعمليات المقارنة تنفيذ الواجهة IComparable. وفي كلتا الحالتين، يمكنك قتل عصفورين بحجر واحد يزيد قليلًا عن حجر.
تجدر الإشارة إلى أنك لا تستطيع إنشاء عوامل من رموز ليست جزءًا من المجموعة القياسية للعوامل. ويمكنك استخدام الرموز الموجودة فقط لتلك العمليات التي ينص التوثيق على إمكانية تحميلها زيادةً. والعوامل التي يمكن تحميلها زيادةً مدرجة هنا.
لاحظ أن ترتيب المعاملات مهم عندما تختلف أنواعها. في الكود أعلاه، pt * 10m تعبير صالح، أما 10m * pt فلن يُترجَم.
يشرح هذا التوثيق الخاص بـالتحميل الزائد للعوامل الصياغة بالتفصيل.