![]() |
|
|||||
Diese Operatoren geben ein Ergebnis vom Typ bool zurück. Beim Vergleich zweier Verweistypobjekte sucht der Compiler zunächst nach relationalen Operatoren für die Objekte. Wird kein anwendbarer Operator ermittelt und lautet die Relation == oder !==, wird der geeignete relationale Operator von der Objektklasse aufgerufen. Dieser Operator prüft, ob es sich bei den beiden Operanden um das gleiche Objekt handelt, nicht aber, ob sie den gleichen Wert aufweisen. Bei Wertetypen ist das Verfahren ebenso, abgesehen davon, dass der integrierte Operator für Wertetypen jedes der Felder im struct überprüft und ein true zurückgibt, wenn alle Werte identisch sind. Für den Typ string werden die relationalen Operatoren überladen, sodass mit == und !== die Werte der Zeichenfolgen verglichen werden, nicht aber die Verweise. 15.8.3 Logische Operatoren
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operator | Beschreibung |
| & | Bitweises AND der zwei Operanden |
| | | Bitweises OR der zwei Operanden |
| ^ | Bitweises exklusives OR (XOR) der zwei Operanden |
| && | Logisches AND der zwei Operanden |
| || | Logisches OR der zwei Operanden |
Die Operatoren &, | und ^ werden üblicherweise für integer-Datentypen verwendet, obwohl sie auch auf bool-Typen angewendet werden können.
Die Operatoren && und || unterscheiden sich von den Einzelzeichenversionen darin, dass sie eine Umgehungsauswertung durchführen. Im Ausdruck
a && b
wird b nur ausgewertet, wenn a wahr (true) ist. Im Ausdruck
a || b
wird b nur ausgewertet, wenn a unwahr (false) ist.
Gelegentlich auch Ternär- oder Frageoperator genannt. Dieser Bedingungsoperator wählt basierend auf einem booleschen Ausdruck aus zwei Ausdrücken aus.
int value = (x < 10) ? 15 : 5;
In diesem Beispiel wird der Steuerungsausdruck (x < 10) ausgewertet. Ist dieser wahr, dann ist der Operatorwert der erste Ausdruck nach dem Fragezeichen, in diesem Fall 15. Ist der Steuerungsausdruck falsch, dann ist der Operatorwert der Ausdruck nach dem Doppelpunkt, hier 5.
Zuweisungsoperatoren werden zur Zuweisung eines Wertes zu einer Variablen eingesetzt. Es gibt zwei Formen: die einfache Zuweisung und die komplexe Zuweisung.
Die einfache Zuweisung erfolgt in C# mit dem einfachen Gleichheitszeichen =. Damit die Zuordnung erfolgreich verläuft, muss die rechte Seite der Zuordnung einen Typ aufweisen, der implizit in den Variablentyp der linken Zuordnungsseite konvertiert werden kann.
Die Operatoren für die komplexe Zuweisung führen neben der einfachen Zuordnung weitere Operationen aus. Die zugehörigen Operatoren lauten:
+= -= *= /= %= &= |= ^= <<= >>=
x <op>= y
wird exakt so ausgewertet, als würde er folgendermaßen ausgedrückt:
x = x <op> y
Hierbei gelten zwei Ausnahmen:
| x wird nur einmal ausgewertet, und die Auswertung wird sowohl für die Operation als auch für die Zuweisung verwendet. |
| Wenn x einen Funktionsaufruf oder Arrayverweise enthält, wird es nur einmal ausgeführt. |
Nach den normalen Konvertierungsregeln und unter der Voraussetzung, dass x und y beides short-Ganzzahlen sind, führt das Auswerten von
x = x + 3;
zu einem Kompilierungsfehler, da die Addition für int-Werte ausgeführt wird, das int-Ergebnis jedoch nicht implizit in einen short-Wert konvertiert wird. In diesem Fall jedoch, da short implizit in int konvertiert werden kann und folgende Schreibweise möglich ist
x = 3;
Die Typenoperatoren beschäftigen sich nicht mit den Werten eines Objekts, sondern mit deren Typen.
Der typeof-Operator gibt den Typ des Objekts zurück, eine Instanz der Klasse System.Type. Typeof ist nützlich, da so nicht erst eine Objektinstanz erstellt werden muss, nur um das type-Objekt zu erhalten. Ist bereits eine Instanz vorhanden, kann durch Aufruf der Funktion GetType() für die Instanz das type-Objekt abgerufen werden.
Nachdem das type-Objekt für einen Typ vorhanden ist, können über die Reflektion weitere Typinformationen abgerufen werden. Weitere Informationen zu diesem Thema finden Sie in Kapitel 31, C# im Detail, im Abschnitt »Weitergehende Reflektion«.
Mit dem is-Operator wird ermittelt, ob ein Objektverweis in einen spezifischen Typ oder eine Schnittstelle konvertiert werden kann. Sehr häufig wird mit diesem Operator ermittelt, ob ein Objekt eine bestimmte Schnittstelle unterstützt.
using System; interface IAnnoy { void PokeSister(string name); } class Brother: IAnnoy { public void PokeSister(string name) { Console.WriteLine("Poking {0}", name); } } class BabyBrother { } class Test { public static void AnnoyHer(string sister, params object[] annoyers) { foreach (object o in annoyers) { if (o is IAnnoy) { IAnnoy annoyer = (IAnnoy) o; annoyer.PokeSister(sister); } } } public static void Main() { Test.AnnoyHer("Jane", new Brother(), new BabyBrother()); } }
Dieser Code erzeugt die folgende Ausgabe:
Poking: Jane
In diesem Beispiel implementiert die Klasse Brother die Schnittstelle IAnnoy, die Klasse BabyBrother implementiert diese Schnittstelle nicht. Die Funktion AnnoyHer() durchläuft alle ihr übergebenen Objekte, um zu ermitteln, ob eines der Objekte IAnnoy unterstützt. Unterstützt das Objekt die Schnittstelle, wird die Funktion PokeSister() aufgerufen.
Der as-Operator ähnelt dem is-Operator, hier wird jedoch nicht nur geprüft, ob es sich bei dem Objekt um einen spezifischen Typ oder eine Schnittstelle handelt, es wird auch eine explizite Konvertierung in diesen Typ oder die Schnittstelle durchgeführt. Kann das Objekt nicht in diesen Typ oder die Schnittstelle konvertiert werden, gibt der Operator null zurück. Das Verwenden von as ist effizienter als die Verwendung von is, da der as-Operator den Objekttyp nur einmal prüft, beim is-Operator wird der Typ dagegen einmal bei der Operatorverwendung und bei der Konvertierung ein zweites Mal geprüft.
Im vorangegangenen Beispiel können die Zeilen
if (o is IAnnoy) { IAnnoy annoyer = (IAnnoy) o; annoyer.PokeSister(sister); }
IAnnoy annoyer = o as IAnnoy; if (Annoyer != null) annoyer.PokeSister(sister);
1 Diese Regeln entsprechen IEEE 754.
2 Da jeder Typ in ein Objekt konvertiert werden kann, sind beliebige Typen möglich.
3 Im unsafe-Modus werden Zeiger um die Größe des referenzierten Objekts erhöht oder erniedrigt.
| << zurück |
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
| |||||
Copyright © Galileo Press GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.