İş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ünde hangi C# işleçlerinin aşırı yüklenebileceği gösterilir.

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

yukarıdaki örneği için örtük bir dönüştürmeintFractiontanımlayarak genişletebilirsiniz. Ardından, aşırı yüklenmiş işleçler bu iki türün bağımsız değişkenlerini destekler. Başka bir ifadeyle, 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üklenebilen 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ımlayın.
(T)x Bir atama ifadesi tarafından gerçekleştirilebilecek özel tür dönüştürmeleri 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şleci 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, defaultdelegate, nameofis, 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.