İş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
public
static
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 veyaT?
buradaT
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ürmeint
Fraction
tanı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 , default delegate , nameof is , 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: