İşleç aşırı yüklemesi - önceden tanımlanmış birli, aritmetik, eşitlik ve karşılaştırma işleçleri

Kullanıcı tanımlı bir tür, önceden tanımlanmış bir C# işlecini aşırı yükleyebilir. Başka bir ifadeyle, işlenenlerden birinin veya her ikisinin de bu türde olması durumunda, bir tür bir işlemin özel uygulamasını sağlayabilir. Aşırı yüklenebilir işleçler bölümü, hangi C# işleçlerinin aşırı yüklenebileceğini gösterir.

operator bir işleci bildirmek için anahtar sözcüğünü kullanın. Bir işleç bildirimi aşağıdaki kuralları karşılamalıdır:

  • Hem a publicstatic hem de değiştirici içerir.
  • Birli işleç bir giriş parametresine sahiptir. İkili işleç iki giriş parametresine sahiptir. Her durumda, en az bir parametrenin türü T olmalıdır veya T? burada T işleç bildirimini içeren türdür.

Aşağıdaki örnek, rasyonel bir sayıyı temsil eden basitleştirilmiş bir yapı tanımlar. Yapı, bazı aritmetik işleçleri aşırı yükler:

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
    }
}

'den int 'e Fractionörtük bir dönüştürme tanımlayarak önceki örneği genişletebilirsiniz. Ardından aşırı yüklenmiş işleçler bu iki türün bağımsız değişkenlerini destekler. Yani, kesire tamsayı eklemek ve sonuç olarak kesir elde etmek mümkün hale gelir.

Özel tür dönüştürmesi tanımlamak için anahtar sözcüğünü operator de kullanırsınız. Daha fazla bilgi için bkz . Kullanıcı tanımlı dönüştürme işleçleri.

Aşırı yüklenebilir işleçler

Aşağıdaki tabloda aşırı yüklenebilen işleçler gösterilmektedir:

İşleçler Notlar
+x, -x, !x, ~x, ++, --, true, false true ve false işleçleri birlikte aşırı yüklenmelidir.
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 aşağıdaki gibi çiftler halinde aşırı yüklenmelidir: == ve !=, < ve ><= ve >=.

Aşırı yüklenemez işleçler

Aşağıdaki tabloda aşırı yüklenemez işleçler gösterilmektedir:

İşleçler Alternatifler
x && y, x || y hem ve false işleçlerini true& hem de veya | işleçlerini aşırı yükleyin. Daha fazla bilgi için bkz. Kullanıcı tanımlı koşullu mantıksal işleçler.
a[i], a?[i] Dizin oluşturucu tanımlama.
(T)x Bir atama ifadesi tarafından gerçekleştirilebilecek özel tür dönüştürmelerini tanımlayın. Daha fazla bilgi için bkz . Kullanıcı tanımlı dönüştürme işleçleri.
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>= karşılık gelen ikili işleci aşırı yükleyin. Örneğin, ikili + işlecini += aşırı yüklerken örtük olarak aşırı yüklenir.
^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
Yok.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin aşağıdaki bölümlerine bakın:

Ayrıca bkz.