Overload af aritmetiske operatorer
Definér +, -, * for egne typer.
Overload af aritmetiske operatorer er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Hvorfor overbelaste aritmetiske operatorer?
Operatoroverbelastning gør det muligt for dine egne typer at bruge velkendte symboler som +, - og *. For værdilignende typer som vektorer, penge eller komplekse tal får det koden til at ligne matematik i stedet for metodekald.
Syntaksen for operator +
En overbelastet operator erklæres som en public static-metode, hvis navn er operator efterfulgt af symbolet. Mindst én parameter skal være den indeholdende type.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var sum = new Vector2(1, 2) + new Vector2(3, 4);
Console.WriteLine(sum);
}
}Subtraktion og multiplikation
Du kan overbelaste flere operatorer på den samme type. Her tilføjer vi subtraktion og skalarmultiplikation til vores vektor.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a, Vector2 b)
=> new Vector2(a.X - b.X, a.Y - b.Y);
public static Vector2 operator *(Vector2 a, int k)
=> new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var v = new Vector2(5, 6) - new Vector2(2, 1);
Console.WriteLine(v);
Console.WriteLine(new Vector2(2, 3) * 4);
}
}Operatorer er altid static
Overbelastede operatorer skal være static. De fungerer ikke på et skjult this; i stedet sendes operanderne som eksplicitte parametre. Kompilatoren knytter symbolet til metoden.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal amount) { Amount = amount; }
public static Money operator +(Money a, Money b)
=> new Money(a.Amount + b.Amount);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var total = new Money(10.5m) + new Money(4.25m);
Console.WriteLine(total);
}
}Unære operatorer
Unære operatorer som negation tager én operand. Overbelast operator - med én parameter for at understøtte udtryk som -v.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator -(Vector2 a)
=> new Vector2(-a.X, -a.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
Console.WriteLine(-new Vector2(3, -7));
}
}Operander af blandede typer
Den ene operand kan være af en anden type. Hvis du angiver begge rækkefølger, kan brugere skrive udtrykket naturligt på begge måder.
using System;
public struct Temperature
{
public double Celsius;
public Temperature(double c) { Celsius = c; }
public static Temperature operator +(Temperature t, double delta)
=> new Temperature(t.Celsius + delta);
public static Temperature operator +(double delta, Temperature t)
=> new Temperature(t.Celsius + delta);
public override string ToString() => Celsius + "C";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Temperature(20) + 5);
Console.WriteLine(5 + new Temperature(20));
}
}Returnering af nye værdier
Aritmetiske operatorer bør ikke ændre deres operander. De beregner og returnerer en new-værdi, så originalerne forbliver uændrede, ligesom int gør.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b)
=> new Vector2(a.X + b.X, a.Y + b.Y);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var a = new Vector2(1, 1);
var b = new Vector2(2, 2);
var c = a + b;
Console.WriteLine("a unchanged: " + a);
Console.WriteLine("result: " + c);
}
}Kædning af aritmetiske operationer
Fordi hver operator returnerer den samme type, kan udtryk kædes naturligt sammen, samtidig med at normal operatorprioritet og associativitet respekteres.
using System;
public struct Vector2
{
public int X, Y;
public Vector2(int x, int y) { X = x; Y = y; }
public static Vector2 operator +(Vector2 a, Vector2 b) => new Vector2(a.X + b.X, a.Y + b.Y);
public static Vector2 operator *(Vector2 a, int k) => new Vector2(a.X * k, a.Y * k);
public override string ToString() => "(" + X + ", " + Y + ")";
}
public class Program
{
public static void Main()
{
var result = new Vector2(1, 1) + new Vector2(2, 2) * 3;
Console.WriteLine(result);
}
}Operatorer på klasser
Operatoroverbelastning fungerer også på klasser, ikke kun på structs. Vær opmærksom på null: En klasseoperand kan være null, så du skal kontrollere det efter behov.
using System;
public class Complex
{
public double Re, Im;
public Complex(double re, double im) { Re = re; Im = im; }
public static Complex operator +(Complex a, Complex b)
=> new Complex(a.Re + b.Re, a.Im + b.Im);
public override string ToString() => Re + " + " + Im + "i";
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Complex(1, 2) + new Complex(3, 4));
}
}En komplet numerisk type
Her er en lille brøktype med addition. Den viser, hvordan overbelastning får en domænetype til at opføre sig som et indbygget tal.
using System;
public struct Fraction
{
public int Num, Den;
public Fraction(int num, int den) { Num = num; Den = den; }
public static Fraction operator +(Fraction a, Fraction b)
=> new Fraction(a.Num * b.Den + b.Num * a.Den, a.Den * b.Den);
public override string ToString() => Num + "/" + Den;
}
public class Program
{
public static void Main()
{
Console.WriteLine(new Fraction(1, 2) + new Fraction(1, 3));
}
}Prøv selv
Giv en pengelignende struct addition og skalarmultiplikation, og byg derefter et udtryk, der læses som almindelig aritmetik.
using System;
public struct Money
{
public decimal Amount;
public Money(decimal a) { Amount = a; }
public static Money operator +(Money a, Money b) => new Money(a.Amount + b.Amount);
public static Money operator *(Money a, int qty) => new Money(a.Amount * qty);
public override string ToString() => "$" + Amount;
}
public class Program
{
public static void Main()
{
var price = new Money(4.50m);
var total = price * 3 + new Money(2.00m);
Console.WriteLine(total);
}
}Hurtigt tjek
Genopfrisk signaturen for en overbelastet operator.
Opsummering
Overbelastning af aritmetiske operatorer får værdilignende typer til at ligne matematik.
- Deklarer dem som
public staticmed nøgleordetoperator. - Mindst én parameter skal være den indeholdende type.
- Returner en ny værdi; ændr aldrig operanderne.
- Angiv begge operandrækkefølger for aritmetik med blandede typer.
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “Overload af aritmetiske operatorer” gratis?
Ja — hele teksten til “Overload af aritmetiske operatorer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Overload af aritmetiske operatorer”?
Definér +, -, * for egne typer. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Overload af aritmetiske operatorer”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Overload af aritmetiske operatorer
- Overload af sammenligningsoperatorer
- Brugerdefinerede konverteringer
- Best practices for operator-overload