Bagikan melalui


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 dan static.
  • Operator tunggal memiliki satu parameter input. Operator biner memiliki dua parameter input. Dalam setiap kasus, setidaknya satu parameter harus memiliki jenis T atau T? di mana T 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 - yx * y, x / y, , x % y,
x & y, , x | yx ^ y,
x << y, , x >> yx >>> y
x == y, , x != yx < 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.yx = 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, , stackallocswitch, , typeof,with
Tidak ada.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:

Lihat juga