Operátorok túlterhelése – előre definiált, nem meghatározott, számtani, egyenlőségi és összehasonlító operátorok
A felhasználó által definiált típus túlterhelhet egy előre definiált C# operátort. Ez azt jelzi, hogy egy típus lehetővé teheti egy művelet egyéni implementálását abban az esetben, ha az egyik vagy mindkét operandus ilyen típusú. A Túlterhelhető operátorok szakasz azt mutatja be, hogy mely C#-operátorok terhelhetők túl.
operator
A kulcsszó használatával deklarálhat egy operátort. Az operátor-deklarációnak meg kell felelnie a következő szabályoknak:
- Tartalmaz egy
public
és egystatic
módosító is. - A nem kötelező operátorok egyetlen bemeneti paraméterrel rendelkeznek. A bináris operátor két bemeneti paraméterrel rendelkezik. Minden esetben legalább egy paraméternek típussal
T
T?
T
vagy az operátor deklarációt tartalmazó típussal kell rendelkeznie.
Az alábbi példa egy egyszerűsített struktúrát határoz meg, amely egy racionális számot jelöl. A struktúra túlterheli az aritmetikai operátorok némelyikét:
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
}
}
Az előző példát kiterjesztheti úgy, hogy implicit konverziót határoz meg a célról int
a következőre Fraction
: . Ezután a túlterhelt operátorok támogatnák a két típus argumentumait. Ez azt jelenti, hogy egész számokat adhat hozzá egy törthez, és ennek eredményeként beolvashat egy törtet.
A kulcsszóval operator
egyéni típuskonvertálást is definiálhat. További információ: Felhasználó által definiált konverziós operátorok.
Túlterhelhető operátorok
Az alábbi táblázat a túlterhelhető operátorokat mutatja be:
Operátorok | Jegyzetek |
---|---|
+x , -x , !x , ~x ++ , -- , true false |
Az true operátorokat együtt false kell túlterhelni. |
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 következő párokban kell túlterhelni: == és != , < és > , <= és >= . |
Nem túlterhelhető operátorok
Az alábbi táblázat azokat az operátorokat mutatja be, amelyek nem terhelhetők túl:
Operátorok | Alternatívák |
---|---|
x && y , x || y |
Túlterhelje mind az true operátorokat false , mind az & operátorokat | . További információ: Felhasználó által definiált feltételes logikai operátorok. |
a[i] , a?[i] |
Indexelő definiálása. |
(T)x |
Egyéni típuskonvertálások definiálása, amelyeket egy öntött kifejezés hajthat végre. További információ: Felhasználó által definiált konverziós operátorok. |
+= , -= , *= , /= , %= &= , |= , ^= , <<= , , >>= >>>= |
Túlterhelje a megfelelő bináris operátort. Ha például túlterheli a bináris + operátort, += implicit módon túlterhelődik. |
^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 |
Nincs. |
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: