İşleç aşırı yüklemesiC# (başvuru)Operator overloading (C# reference)

Kullanıcı tanımlı bir tür önceden tanımlanmış C# bir işleci aşırı yükleyebilir.A user-defined type can overload a predefined C# operator. Diğer bir deyişle, bir tür, bir veya her iki işlenen bu türden olduğunda bir işlemin özel uygulamasını sağlayabilir.That is, a type can provide the custom implementation of an operation when one or both operands are of that type. Fazla yüklenebilir işleçler bölümünde hangi işleçlerin aşırı C# yüklenmiş olduğu gösterilmektedir.The Overloadable operators section shows which C# operators can be overloaded.

Bir işleç bildirmek için anahtarsözcüğünükullanın.operatorUse the operator keyword to declare an operator. Bir işleç bildiriminin aşağıdaki kuralları karşılaması gerekir:An operator declaration must satisfy the following rules:

  • Hem a public static hem de değiştirici içerir.It includes both a public and a static modifier.
  • Birli operatör bir parametre alır.A unary operator takes one parameter. İkili işleç iki parametre alır.A binary operator takes two parameters. Her durumda, en az bir parametre türünde T T veya T? işleç bildirimini içeren tür olmalıdır.In each case, at least one parameter must have type T or T? where T is the type that contains the operator declaration.

Aşağıdaki örnek, bir Rational Number öğesini temsil eden Basitleştirilmiş yapıyı tanımlar.The following example defines a simplified structure to represent a rational number. Yapı, Aritmetik operatörlerinbazılarını aşırı yükler:The structure overloads some of the arithmetic operators:

using System;

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 ' den int Fractionörtük bir dönüştürme tanımlayarak yukarıdaki örneği genişletebilirsiniz.You could extend the preceding example by defining an implicit conversion from int to Fraction. Daha sonra, aşırı yüklenmiş işleçler bu iki türün bağımsız değişkenlerini destekleyecektir.Then, overloaded operators would support arguments of those two types. Diğer bir deyişle, bir kesire tamsayı eklemek ve sonuç olarak bir kesir elde etmek mümkün olacaktır.That is, it would become possible to add an integer to a fraction and obtain a fraction as a result.

Özel bir tür dönüştürmesi operator tanımlamak için anahtar sözcüğünü de kullanabilirsiniz.You also use the operator keyword to define a custom type conversion. Daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri.For more information, see User-defined conversion operators.

Fazla yüklenebilir işleçlerOverloadable operators

Aşağıdaki tabloda C# işleçlerin fazla gözlebilirlik hakkında bilgi verilmektedir:The following table provides information about overloadability of C# operators:

İşleçlerOperators OverloadabilityOverloadability
+ x, -x, ! x, ~ x, ++, --, true, false+x, -x, !x, ~x, ++, --, true, false Bu birli işleçler aşırı yüklenebilir.These unary operators can be overloaded.
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 > = yx + 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 Bu ikili işleçler aşırı yüklenebilir.These binary operators can be overloaded. Belirli operatörler çiftler halinde aşırı yüklenmiş olmalıdır; daha fazla bilgi için bu tabloyu izleyen nota bakın.Certain operators must be overloaded in pairs; for more information, see the note that follows this table.
x & & y, x | | yx && y, x || y Koşullu mantıksal işleçler aşırı yüklenemez.Conditional logical operators cannot be overloaded. Ancak, aşırı yüklenmiş true ve false işleçlere sahip bir tür & ya | da işlecini belirli bir şekilde && aşırı yükleiyorsa, sırasıyla veya || işleci için değerlendirilebilir Bu türün işlenenleri.However, if a type with the overloaded true and false operators also overloads the & or | operator in a certain way, the && or || operator, respectively, can be evaluated for the operands of that type. Daha fazla bilgi için, C# dil belirtiminin Kullanıcı tanımlı Koşullu mantıksal işleçler bölümüne bakın.For more information, see the User-defined conditional logical operators section of the C# language specification.
bir[i]a[i] Öğe erişimi aşırı yüklenebilir bir operatör olarak kabul edilmez, ancak bir Dizin Oluşturucutanımlayabilirsiniz.Element access is not considered an overloadable operator, but you can define an indexer.
(T)x(T)x Atama işleci aşırı yüklenemez, ancak yeni dönüştürme işleçleri tanımlayabilirsiniz.The cast operator cannot be overloaded, but you can define new conversion operators. Daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri.For more information, see User-defined conversion operators.
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= Bileşik atama işleçleri açık olarak aşırı yüklenemez.Compound assignment operators cannot be explicitly overloaded. Ancak, bir ikili işleci aşırı yüklerken, varsa buna karşılık gelen bileşik atama işleci de dolaylı olarak aşırı yüklenmiştir.However, when you overload a binary operator, the corresponding compound assignment operator, if any, is also implicitly overloaded. Örneğin, += kullanılarak +değerlendirilir, aşırı yüklenmiş olabilir.For example, += is evaluated using +, which can be overloaded.
x = y, x. y, c? t: f, x?? y, x-> y, =>, f (x), as, Checked, unchecked, Default, Delegate, ,, NameOf, Yeni, sizeof, stackalloc, typeofx = y, x.y, c ? t : f, x ?? y, x->y, =>, f(x), as, checked, unchecked, default, delegate, is, nameof, new, sizeof, stackalloc, typeof Bu işleçler aşırı yüklenemez.These operators cannot be overloaded.

Not

Karşılaştırma işleçleri çiftler halinde aşırı yüklenmiş olmalıdır.The comparison operators must be overloaded in pairs. Diğer bir deyişle, bir çiftin işleci aşırı yüklenmişse, diğer işlecin da aşırı yüklenmesi gerekir.That is, if either operator of a pair is overloaded, the other operator must be overloaded as well. Böyle çiftler aşağıdaki gibidir:Such pairs are as follows:

  • ==ve != işleçleri== and != operators
  • <ve > işleçleri< and > operators
  • <=ve >= işleçleri<= and >= operators

C# dili belirtimiC# language specification

Daha fazla bilgi için, C# dil belirtimininaşağıdaki bölümlerine bakın:For more information, see the following sections of the C# language specification:

Ayrıca bkz.See also