C # Betreiber Überlastung
Sie können die eingebaute in C # Bediener neu zu definieren oder außer Kraft setzen. Daher können Programmierer die benutzerdefinierten Operatoren Typ verwenden. Überladene Operatoren werden mit einem speziellen Funktionsnamen, gefolgt von dem SchlüsselwortOperator Operator Symbol Definition.Und andere Funktionen überladene Operatoren haben einen Rückgabetyp und Parameterliste.
Betrachten wir zum Beispiel die folgende Funktion:
public static Box Operator + (Box b, Box c) { Box box = neue Box (); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; Rückkehr-Box; }
Die obige Funktion ist benutzerdefinierten Klasse Box implementiert den Additionsoperator (+). Es ist die Eigenschaft von zwei Box-Objekte hinzugefügt werden, und die Rück Box Objekte hinzugefügt.
Betreiber Überlastung zu erreichen
Das folgende Programm zeigt die vollständige Umsetzung:
using System; Namespace OperatorOvlApplication { Klasse Box { private Doppel Länge; // Länge private Doppel Breite; // Breite private Doppel Höhe; // Höhe public double getVolume () { Rückkehr Länge * Breite * Höhe; } public void setlength (double len) { length = len; } public void setBreadth (Doppel bre) { Breite = bre; } public void setHeight (Doppel hei) { height = hei; } // Überladene + Operator auf die Summe der beiden Box-Objekte public static Box Operator + (Box b, Box c) { Box box = neue Box (); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; Rückkehr-Box; } } Klasse Tester { static void Main (string [] args) { Box Box1 = new Box (); // erklären Box1, Typ Box Box Box2 = new Box (); // erklären Box2, Typ Box Box Box3 = new Box (); // erklären Box3, Typ Box Doppel Volumen = 0,0; // // Box1 Volumen Detaillierung Box1.setLength (6.0); Box1.setBreadth (7.0); Box1.setHeight (5,0); // Box2 Detaillierung Box2.setLength (12,0); Box2.setBreadth (13,0); Box2.setHeight (10,0); // Box1 Volumen = Volumen Box1.getVolume (); Console.WriteLine ( "Box1 Volumen: {0}", Volumen); // Box2 Volumen = Volumen Box2.getVolume (); Console.WriteLine ( "Box2 Volumen: {0}", Volumen); // Die beiden Objekte hinzugefügt Box3 = Box1 + Box2; // Box3 Volumen = Volumen Box3.getVolume (); Console.WriteLine ( "Box3 Volumen: {0}", Volumen); Console.ReadKey (); } } }
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:
Box1 Volumen: 210 Box2 Volumen: 1560 Box3 Volumen: 5400
Wiederbeladbare und nicht-überladene Operatoren
Die folgende Tabelle beschreibt die Fähigkeit des C # Betreiber Überlastung:
运算符 | 描述 |
---|---|
+, -, !, ~, ++, -- | 这些一元运算符只有一个操作数,且可以被重载。 |
+, -, *, /, % | 这些二元运算符带有两个操作数,且可以被重载。 |
==, !=, <, >, <=, >= | 这些比较运算符可以被重载。 |
&&, || | 这些条件逻辑运算符不能被直接重载。 |
+=, -=, *=, /=, %= | 这些赋值运算符不能被重载。 |
=, ., ?:, ->, new, is, sizeof, typeof | 这些运算符不能被重载。 |
Beispiele
Für die obige Diskussion, lassen Sie uns das Beispiel oben erweitern, mehr überladene Operatoren:
using System; Namespace OperatorOvlApplication { Klasse Box { private Doppel Länge; // Länge private Doppel Breite; // Breite private Doppel Höhe; // Höhe public double getVolume () { Rückkehr Länge * Breite * Höhe; } public void setlength (double len) { length = len; } public void setBreadth (Doppel bre) { Breite = bre; } public void setHeight (Doppel hei) { height = hei; } // Überladene + Operator auf die Summe der beiden Box-Objekte public static Box Operator + (Box b, Box c) { Box box = neue Box (); box.length = b.length + c.length; box.breadth = b.breadth + c.breadth; box.height = b.height + c.height; Rückkehr-Box; } public static bool operator == (Box lhs, Box rhs) { bool status = false; if (lhs.length == rhs.length && lhs.height == rhs.height && Lhs.breadth == rhs.breadth) { Status = true; } Zustand zurückzukehren; } public static bool operator! = (Box lhs, Box rhs) { bool status = false; if (lhs.length! = rhs.length || lhs.height! = rhs.height || Lhs.breadth! = Rhs.breadth) { Status = true; } Zustand zurückzukehren; } public static bool operator <(Box lhs, Box rhs) { bool status = false; if (lhs.length <rhs.length && lhs.height <Rhs.height && lhs.breadth <rhs.breadth) { Status = true; } Zustand zurückzukehren; } public static bool operator> (Box lhs, Box rhs) { bool status = false; if (lhs.length> rhs.length && lhs.height > Rhs.height && lhs.breadth> rhs.breadth) { Status = true; } Zustand zurückzukehren; } public static bool operator <= (Box lhs, Box rhs) { bool status = false; if (lhs.length <= rhs.length && lhs.height <= Rhs.height && lhs.breadth <= rhs.breadth) { Status = true; } Zustand zurückzukehren; } public static bool operator> = (Box lhs, Box rhs) { bool status = false; if (lhs.length> = rhs.length && lhs.height > = Rhs.height && lhs.breadth> = rhs.breadth) { Status = true; } Zustand zurückzukehren; } public override string ToString () { Rückkehr String.Format ( "({0}, {1}, {2})", Länge, Breite, Höhe); } } Klasse Tester { static void Main (string [] args) { Box Box1 = new Box (); // erklären Box1, Typ Box Box Box2 = new Box (); // erklären Box2, Typ Box Box Box3 = new Box (); // erklären Box3, Typ Box Box Box4 = new Box (); Doppel Volumen = 0,0; // // Box1 Volumen Detaillierung Box1.setLength (6.0); Box1.setBreadth (7.0); Box1.setHeight (5,0); // Box2 Detaillierung Box2.setLength (12,0); Box2.setBreadth (13,0); Box2.setHeight (10,0); // Verwenden Sie die überladene ToString () zwei Boxen Console.WriteLine ( "Box1: {0}", Box1.ToString ()); Console.WriteLine ( "Box2: {0}", Box2.ToString ()); // Box1 Volumen = Volumen Box1.getVolume (); Console.WriteLine ( "Box1 Volumen: {0}", Volumen); // Box2 Volumen = Volumen Box2.getVolume (); Console.WriteLine ( "Box2 Volumen: {0}", Volumen); // Die beiden Objekte hinzugefügt Box3 = Box1 + Box2; Console.WriteLine ( "Box3: {0}", Box3.ToString ()); // Box3 Volumen = Volumen Box3.getVolume (); Console.WriteLine ( "Box3 Volumen: {0}", Volumen); // Vergleicht man die Boxen if (Box1> Box2) Console.WriteLine ( "Box1 größer als Box2"); sonst Console.WriteLine ( "box1 nicht mehr als Box2"); if (Box1 <Box2) Console.WriteLine ( "Box1 weniger als Box2"); sonst Console.WriteLine ( "box1 nicht weniger als Box2"); if (Box1> = Box2) Console.WriteLine ( "Box1 größer oder gleich Box2"); sonst Console.WriteLine ( "BOX1 nicht größer oder gleich Box2"); if (Box1 <= Box2) Console.WriteLine ( "Box1 weniger Box2"); sonst Console.WriteLine ( "Box1 nicht weniger Box2"); if (Box1! = Box2) Console.WriteLine ( "Box1 nicht gleich Box2"); sonst Console.WriteLine ( "Box1 gleich Box2"); Box4 = Box3; if (Box3 == Box4) Console.WriteLine ( "Box3 gleich Box4"); sonst Console.WriteLine ( "Box3 nicht gleich Box4"); Console.ReadKey (); } } }
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:
Box 1: (6, 7, 5) Box2: (12, 13, 10) Box1 Volumen: 210 Box2 Volumen: 1560 BOX3: (18, 20, 15) Box3 Volumen: 5400 Box1 Box2 nicht mehr als Box1 Box2 weniger als Box1 Box2 nicht größer als oder gleich Box1 Box2 weniger Box1 Box2 nicht gleich Box3 gleich Box4