İşleç aşırı yüklemesi (C# başvurusu)
Kullanıcı tanımlı tür, önceden tanımlanmış bir C# işlecinin aşırı yüklenmesine neden olabilir. Diğer bir ifade, işlenenlerden birinin veya her ikisinin de bu türe uygun olduğu durumda bir işlem için özel uygulama sağlar. Aşırı Yüklenebilir işleçler bölümünde hangi C# işleçleri aşırı yüklenebilir gösterir.
bir operator işleci bildir için anahtar sözcüğünü kullanın. Bir işleç bildirimi aşağıdaki kuralları karşılamalı:
- Hem hem de
publicstaticdeğiştiricisini içerir. - Birli işleç bir giriş parametresine sahip olur. İkili işleç iki giriş parametresine sahip. Her durumda, en az bir parametre türüne sahip
TolmalıdırT?veya buradaTişleç bildirimini içeren türdür.
Aşağıdaki örnek, rasyonal sığayı temsil eden basitleştirilmiş bir yapı tanımlar. Yapısı, bazı aritmetik işleçleri aşırı yüklüdür:
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 'ye örtülü bir dönüştürme tanımlayarak önceki örneği int genişleterek. Fraction 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 kesir için bir tamsayı eklemek ve sonuç olarak kesir elde etmek mümkün olabilir.
Özel tür dönüştürmesi operator tanımlamak için anahtar sözcüğünü de kullanabilirsiniz. Daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri.
Aşırı yüklenilebilir işleçler
Aşağıdaki tabloda C# işleçlerinin aşırı yüklenebilirliği hakkında bilgi vemektedir:
| İşleçler | Aşırı Yüklenebilirlik |
|---|---|
| +x, -x, !x, ~x ++ , , -- true, false | Bu birli işleçler aşırı yüklenmiş olabilir. |
| 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 | Bu ikili işleçler aşırı yüklenmiş olabilir. Belirli işleçlerin çift olarak aşırı yüklenmesi gerekir; Daha fazla bilgi için bu tabloyu izleyen nota bakın. |
| x && y, x || y | Koşullu mantıksal işleçler aşırı yük olamaz. Ancak, aşırı yüklenmiş ve true false işleçleri olan bir tür de veya işlecini belirli bir şekilde aşırı yüklese, veya işleci sırasıyla bu türün işlenenleri & için değerlendir | && || olabilir. Daha fazla bilgi için C# dil belirtimlerinin Kullanıcı tanımlı koşullu mantıksal işleçler bölümüne bakın. |
bir[i], a?[i] |
Öğe erişimi aşırı yüklenebilir bir işleç olarak kabul edilemez, ancak bir dizin oluşturma tanımlayabilirsiniz. |
| (T)x | Tür dönüştürme işleci aşırı yük olamaz, ancak bir tür dönüştürme ifadesi tarafından gerçekleştirilecek özel tür dönüştürmeleri tanımlayabilirsiniz. Daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri. |
| +=, -= *= , , , , /=|= %= , &= ^= ,<<=, >>= | Bileşik atama işleçleri açıkça aşırı yük olamaz. Ancak, bir ikili işleci aşırı yüklüyken, varsa karşılık gelen bileşik atama işleci de örtülü olarak aşırı yüklenmiştir. Örneğin, += kullanılarak değerlendirilir ve + bu aşırı yüke neden olabilir. |
^x, x = y, x.y x?.y , , c ? t : f, x ?? y, x ?? = y, x.. y, x->y, , f(x) , olarak , await , işaretli , denetlenmeyen => , varsayılan , temsilci , is , nameof, new, sizeof, stackalloc, switch, typeof, with |
Bu işleçler aşırı yük olamaz. |
Not
Karşılaştırma işleçlerinin çiftler halinde aşırı yüklenmesi gerekir. Başka bir ifadeyle, bir çiftin herhangi bir işleci aşırı yüklenmişse, diğer işleç de aşırı yük yüklenmiş olması gerekir. Bu tür çiftler aşağıdaki gibidir:
==and!=işleçleri<and>işleçleri<=and>=işleçleri
C# dili belirtimi
Daha fazla bilgi için C# dil belirtimlerinin aşağıdaki bölümlerine bakın: