Kelebihan beban operator - operator unary, aritmatika, kesetaraan, dan perbandingan yang telah ditentukan sebelumnya
Suatu jenis yang ditentukan pengguna dapat membebani operator C# yang telah ditentukan sebelumnya. Artinya, jenis dapat menyediakan implementasi kustom operasi jika salah satu atau kedua operand berasal dari jenis tersebut. Bagian Operator yang kelebihan beban menunjukkan operator C# mana yang dibebani.
Gunakan kata kunci operator
untuk mendeklarasikan operator. Suatu deklarasi operator harus memenuhi aturan berikut:
- Termasuk pula pengubah
public
danstatic
. - Operator tunggal memiliki satu parameter input. Operator biner memiliki dua parameter input. Dalam setiap kasus, setidaknya satu parameter harus memiliki jenis
T
atauT?
di manaT
adalah jenis yang berisi deklarasi operator.
Contoh berikut mendefinisikan struktur yang disederhanakan untuk mewakili angka rasional. Struktur membebani beberapa operator aritmatika:
public readonly struct Fraction
{
private readonly int num;
private readonly int den;
public Fraction(int numerator, int denominator)
{
if (denominator == 0)
{
throw new ArgumentException("Denominator cannot be zero.", nameof(denominator));
}
num = numerator;
den = denominator;
}
public static Fraction operator +(Fraction a) => a;
public static Fraction operator -(Fraction a) => new Fraction(-a.num, a.den);
public static Fraction operator +(Fraction a, Fraction b)
=> new Fraction(a.num * b.den + b.num * a.den, a.den * b.den);
public static Fraction operator -(Fraction a, Fraction b)
=> a + (-b);
public static Fraction operator *(Fraction a, Fraction b)
=> new Fraction(a.num * b.num, a.den * b.den);
public static Fraction operator /(Fraction a, Fraction b)
{
if (b.num == 0)
{
throw new DivideByZeroException();
}
return new Fraction(a.num * b.den, a.den * b.num);
}
public override string ToString() => $"{num} / {den}";
}
public static class OperatorOverloading
{
public static void Main()
{
var a = new Fraction(5, 4);
var b = new Fraction(1, 2);
Console.WriteLine(-a); // output: -5 / 4
Console.WriteLine(a + b); // output: 14 / 8
Console.WriteLine(a - b); // output: 6 / 8
Console.WriteLine(a * b); // output: 5 / 8
Console.WriteLine(a / b); // output: 10 / 4
}
}
Anda dapat memperluas contoh sebelumnya dengan menentukan konversi implisit dari int
ke Fraction
. Kemudian, operator yang kelebihan beban akan mendukung argumen dari kedua jenis tersebut. Artinya, akan menjadi mungkin untuk menambahkan bilangan bulat ke pecahan dan mendapatkan pecahan sebagai hasilnya.
Anda juga menggunakan operator
kata kunci untuk menentukan konversi jenis kustom. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.
Operator yang kelebihan beban
Tabel berikut ini memperlihatkan operator yang bisa kelebihan beban:
Operator | Catatan |
---|---|
+x , , !x -x , ~x , ++ , -- , , true ,false |
Operator true dan false harus kelebihan beban bersama-sama. |
x + y , , x - y x * y , x / y , , x % y ,x & y , , x | y x ^ y ,x << y , , x >> y x >>> y |
|
x == y , , x != y x < y , x > y , , x <= y ,x >= y |
Harus kelebihan beban berpasangan sebagai berikut: == dan != , < dan > , <= dan >= . |
Operator yang tidak dapat dimuat berlebih
Tabel berikut ini memperlihatkan operator yang tidak dapat kelebihan beban:
Operator | Alternatif |
---|---|
x && y , x || y |
Kelebihan beban operator true dan false dan & operator atau | . Untuk informasi selengkapnya, lihat Operator logis kondisional yang ditentukan pengguna. |
a[i] , a?[i] |
Tentukan pengindeks. |
(T)x |
Tentukan konversi jenis kustom yang dapat dilakukan oleh ekspresi pemeran. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna. |
+= , , -= *= , /= , %= , &= , |= , ^= , <<= , , , >>= >>>= |
Membebani operator biner yang sesuai. Misalnya, ketika Anda membebani operator biner + , += secara implisit kelebihan beban. |
^x , , x.y x = y , x?.y , c ? t : f , x ?? y , , ??= y ,x..y , , => x->y , f(x) , as , await , checked , unchecked , default , delegate , is , nameof , , , new sizeof , , stackalloc switch , , typeof ,with |
Tidak ada. |
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#: