Можна визначати в класі наступні унарні операції:
+ - ! - ++ -- true false
Синтаксис об'явника унарної операції:
тип operator унарна_операція ( параметр )
Приклади заголовків унарних операцій:
public static int operator +(MyObject m )
public static MyObject operator -- ( MyObject m )
public static bool operator true(MyObject m )
Параметр, переданий в операцію, повинен мати тип класу, для якого вона визначається. Операція повинна повертати:
§ для операцій +, - ! ~ величину будь-якого типу;
§ для операцій ++ -- величину типу класу, для якого вона відзначається;
§ для операцій true і false величину типу bool.
Операції не повинні змінювати значення переданого ним операнда. Операція, що повертає величину типу класу, для якого вона визначається, повинна створити новий об'єкт цього класу, виконати з ним необхідні дії і передати його як результат.
Префіксний і постфіксний інкременти не розрізняються.
Як приклад удосконалимо приведений в лістингу 7.3 клас Safearray для зручної і безпечної роботи з масивом. До класу внесені наступні зміни:
§ доданий конструктор, що дозволяє ініціалізувати масив звичайним масивом або серією цілочисельних значень довільного розміру;
§ додана операція інкремента;
§ доданий допоміжний метод Print виведення масиву;
§ змінена стратегія обробки помилок виходу за межі масиву;
§ знята вимога, щоб елементи масиву приймали значення в заданому діапазоні.
Текст програми приведений в лістингу 7.5.
Лістинг 7.5. Визначення операції інкремента для класу
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace examp44
{
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 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 Class1
{
static void Main()
{
try
{
int[] f = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
SafeArray a1 = new SafeArray(f);
a1.Print("Масив 1");
a1++;
a1.Print("Інкремент масиву 1");
}
catch (Exception e) // обробка виключення
{
Console.WriteLine(e.Message);
}
}
}
}