سربارگذاری عملگرها

سربارگذاری عملگرها (Operator Overloading) به شما اجازه می‌دهد که رفتار عملگرهای سی شارپ را بسته به نوع عملوندهای آنها سفارشی کنید. سربارگذاری عملگرها همچنین به عملگر اجازه می‌دهد که یک شیء را به روشی دیگر ترجمه کند. به کد زیر توجه کنید :

   1: class MyNumber
   2: {
   3:     public int Number { get; set; }
   4: }
   5: 
   6: class Program
   7: {
   8:     public static void Main()
   9:     {
  10:         MyNumber firstNumber = new MyNumber();
  11:         MyNumber secondNumber = new MyNumber();
  12: 
  13:         firstNumber.Number = 10;
  14:         secondNumber.Number = 5;
  15: 
  16:         MyNumber sum = firstNumber + secondNumber;
  17:     }
  18: }

خط پررنگ شده در کد بالا (خط 18) کد قابل قبولی نیست چون، کامپایلر نمی‌تواند دو شیء را با هم جمع کند. رفتاری که ما از کد بالا انتظار داریم اضافه کردن مقادیر به خاصیت Number دو عملوند و سپس ایجاد یک شیء جدید که حاصل جمع دو مقدار در داخل آن قرار بگیرد. سپس این شیء جدید به متغیر sum تخصیص داده شود.

سر بارگذاری عملگرهای دوتایی

برنامه را برای اضافه کردن سربارگذاری یک عملگر دوتایی (+) که دو عملوند قبول می‌کند تغییر می‌دهیم.

   1: using System;                                                  
   2:                                                                
   3: class MyNumber                                                 
   4: {                                                              
   5:     public int Number { get; set; }                            
   6:                                                                
   7:     public static MyNumber operator +(MyNumber n1, MyNumber n2) 
   8:     {                                                           
   9:         MyNumber result = new MyNumber();                       
  10:         result.Number = n1.Number + n2.Number;                  
  11:         return result;                                          
  12:     }                                                           
  13: }                                                              
  14:                                                                
  15: class Program                                                  
  16: {                                                              
  17:     public static void Main()                                  
  18:     {                                                          
  19:         MyNumber firstNumber = new MyNumber();                 
  20:         MyNumber secondNumber = new MyNumber();                
  21:                                                                
  22:         firstNumber.Number = 10;                               
  23:         secondNumber.Number = 5;                               
  24:                                                                
  25:         MyNumber sum = firstNumber + secondNumber;             
  26:                                                                
  27:         Console.WriteLine("Sum = {0}", sum.Number);            
  28:     }                                                          
  29: }
Sum = 15

برای سربارگذاری عملگرها به صورت زیر عمل کنید :

public static returnType operator operatorSymbol(type operand1, type operand2)
{
   //Codes here
   return result;
}

همانطور که مشاهده می‌کنید در سربارگذاری عملگرها از یک متد که هم static و هم public باشد استفاده می‌شود. این متد باید static باشد چون همه نمونه‌های کلاس از آن استفاده می‌کنند و هم باید public باشد تا بتوان در خارج از کلاس از آن استفاده کرد. سپس از کلمه کلیدی operator و بعد از آن از علامت یک عملگر مانند + یا استفاده می‌کنیم.
در سربارگذاری یک عملگر دوتایی به دو عملوند نیاز است، بنابراین متد دارای دو پارامتر است که این دو عملوند را قبول می‌کند. در داخل کد یک شیء ایجاد شده است که نتیجه را در خود نگداری می‌کند. دو خاصیت Number برای دو پارامتر اضافه کرده و حاصل جمع این دو را در خاصیت Number شی result (که نتیجه را در خود ذخیره می‌کند) قرار می‌دهیم (خط 12). و در آخر نتیجه را به فراخوان بازگشت می‌دهیم (خط 13). شیء result به متغیر sum ارجاع داده شده است.
همه عملگرها نمی‌توانند سر بارگذاری شوند. مثلاً شما نمی‌توانید عملگر += را سربارگذاری کنید. شما می‌توانید عملگر + را سربارگذاری کنید که در این صورت عملگر =+ به صورت خودکار سربارگذاری می‌شود. عملگرهای > یا < باید به صورت جفت سربارگذاری شوند. مثلاً نمی‌توان عملگر > را به تنهایی سربارگذاری کنید.

public static bool operator >(MyNumber n1, MyNumber n2)
{
    return (n1.Number > n2.Number);
}

public static bool operator <(MyNumber n1, MyNumber n2)
{
    return (n1.Number < n2.Number);
}

سربارگذاری عملگرهای یگانی

سربارگذاری عملگر یگانی بسیار ساده است. همه کاری که شما باید انجام دهید تهیه یک پارامتر است چون عملگر یگانی 1 عملوند قبول می‌کند. به عنوان مثال، اجازه دهید که عملگر یگانی ++ را سربارگذاری کنیم.

public static MyNumber operator ++(MyNumber n1)
{
    MyNumber result = new MyNumber();
    result.Number = n1.Number + 1;
    return result;
}

همانطور که می‌بینید سربارگذاری عملگرهای یگانی شبیه به سربارگذاری عملگرهای دوتایی است. در سربارگذاری عملگرها به نکات زیر توجه کنید :

لیست عملگرهایی که قابلیت سربارگذاری را دارند، در زیر آمده است.
عملگرهای دوتایی :

+, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

عملگرهای یگانی

+, -, !, ~, ++, --, true, false