প্রধান গাণিতিক ও তুলনা অপারেটরগুলোকে আপনার নিজের ক্লাস ও স্ট্রাক্টের কাজে লাগানোর জন্য উপযোগী করে তোলা যায়। এটাই অপারেটর ওভারলোডিং নামে পরিচিত।
এই আর্টিকেলটিতে সিনট্যাক্স নিয়ে বিস্তারিত আলোচনা আছে, সাথে কোন কোন অপারেটর ওভারলোড করা যায় আর কোনগুলো যায় না, তাও বলা হয়েছে।
বেশিরভাগ অপারেটরের রূপটি এমন:
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 কম্পাইল হবে না।
অপারেটর ওভারলোডিংয়ের এই ডকুমেন্টেশনে সিনট্যাক্সের বিস্তারিত বিবরণ রয়েছে।