Можна визначати в класі наступні бінарні операції:
+ - * / % & | ^ << >> == != > < >= <=
Синтаксис об'явника бінарної операції:
тип operator бінарна_операція (параметр1, параметр2)
Приклади заголовків бінарних операцій:
Cjblic static MyObject operator + (MyObject m1, MyObject m2 )
Cublic static bool operator = = (MyObject m1, MyObject m2 )
Хоч би один параметр, переданий в операцію, повинен мати тип класу, для якого вона визначається. Операція може повертати величину будь-якого типу.
Операції == і ! =, > і <, >= і <= визначаються тільки парами і зазвичай повертають логічне значення. Найчастіше в класі визначають операції порівняння на рівність і нерівність для того, щоб забезпечити порівняння об'єктів, а не їх посилань, як визначено за умовчанням для посилальних типів. Перевантаження операцій відношення вимагає знання інтерфейсів, тому вона розглядається пізніше.
Приклад визначення операції складання для класу Safearray, описаного в попередньому розділі, приведений в лістингу 7.6. Залежно від операндів операція або виконує поелементне складання двох масивів, або додає значення операнда до кожного елементу масиву.
Лістинг 7.6. Визначення операції складання для класу SafeArray
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace examp47
{
class SafeArray
{
public SafeArray( int size )
{
a = new int[size] ;
length = size;
}
public SafeArray( params int[ ] arr )
{
length = arr.Length;
a = new int[length] ;
for ( int i = 0; i < length; ++i ) a[i] = arr[i];
}
public static SafeArray operator + ( SafeArray x, SafeArray y ) // +
{
int len = x.length < y.length ? x.length : y.length;
SafeArray temp = new SafeArray (len) ;
for ( int i = 0; i < len; ++i ) temp[i] = x[i] + y[i];
return temp;
}
public static SafeArray operator + ( SafeArray x, int y ) // +
{
SafeArray temp = new SafeArray(x.length);
for (int i = 0; i < x.length; ++i) temp[i] = x[i] + y;
return temp;
}
public static SafeArray operator +(int x, SafeArray y) // +
{
SafeArray temp = new SafeArray(y.length);
for (int i = 0; i < y.length; ++i) temp[i] = x + y[i];
return temp;
}
public static SafeArray operator ++ ( SafeArray x ) // ++
{
SafeArray temp = new SafeArray(x.length);
for ( int i = 0; i < x.length; ++i ) temp[i] = ++x.a[i] ;
return temp;
}
public int this[int i] // []
{
get
{
if (i >= 0 && i < length) return a[i];
else throw new IndexOutOfRangeException();
}
set
{
if (i >= 0 && i < length) a[i] = value;
else throw new IndexOutOfRangeException();
}
}
public void Print( string name )
{
Console.WriteLine(name + ": " );
for ( int i = 0; i < length; ++i ) Console.Write("\t" + a[i]);
Console.WriteLine();
}
int[] a; //закритий масив
int length; //закрита розмірність
}
class Classl
{
static void Main()
{
try
{
SafeArray a1 = new SafeArray( 5, 2, -1, 1, -2 );
a1.Print ( "Масив 1" );
SafeArray a2 = new SafeArray( 1, 0, 3 );
a2.Print( "Масив 2" );
SafeArray a3 = a1 + a2;
a3.Print( "Сума масивів 1 и 2" );
a1 = a1 + 100; // 1
a1.Print ( "Масив 1 + 100" );
a1 = 100 + a1 ; // 2
a1.Print ("100 + масив 1" );
a2 += ++a2+1; // 3
a2.Print( "++a2.a2 + a2 + 1" );
}
catch ( Exception e )
{
Console.WriteLine( e.Message ) ;
}
}
}
}
Щоб забезпечити можливість складання з константою, операція складання перевантажена двічі для випадків, коли константа є першим і другим операндом (оператори 2 і 1).
Складну операцію привласнення += (оператор 3) визначати не потрібно, та це і неможливо. При її виконанні автоматично викликається спочатку операція складання, потім привласнення.