Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 6. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Das Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Strukturen und Enumerationen
7 Fehlerbehandlung und Debugging
8 Auflistungsklassen (Collections)
9 Generics – Generische Datentypen
10 Weitere C#-Sprachfeatures
11 LINQ
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 XML
15 Multithreading und die Task Parallel Library (TPL)
16 Einige wichtige .NET-Klassen
17 Projektmanagement und Visual Studio 2012
18 Einführung in die WPF und XAML
19 WPF-Layout-Container
20 Fenster in der WPF
21 WPF-Steuerelemente
22 Elementbindungen
23 Konzepte von WPF
24 Datenbindung
25 Weitere Möglichkeiten der Datenbindung
26 Dependency Properties
27 Ereignisse in der WPF
28 WPF-Commands
29 Benutzerdefinierte Controls
30 2D-Grafik
31 ADO.NET – Verbindungsorientierte Objekte
32 ADO.NET – Das Command-Objekt
33 ADO.NET – Der SqlDataAdapter
34 ADO.NET – Daten im lokalen Speicher
35 ADO.NET – Aktualisieren der Datenbank
36 Stark typisierte DataSets
37 Einführung in das ADO.NET Entity Framework
38 Datenabfragen des Entity Data Models (EDM)
39 Entitätsaktualisierung und Zustandsverwaltung
40 Konflikte behandeln
41 Plain Old CLR Objects (POCOs)
Stichwort

Download:
- Beispiele, ca. 62,4 MB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
Visual C# 2012 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2012

Visual C# 2012
Rheinwerk Computing
1402 S., 6., aktualisierte und erweiterte Auflage 2013, geb., mit DVD
49,90 Euro, ISBN 978-3-8362-1997-6
Pfeil 2 Grundlagen der Sprache C#
Pfeil 2.1 Konsolenanwendungen
Pfeil 2.1.1 Allgemeine Anmerkungen
Pfeil 2.1.2 Ein erstes Konsolenprogramm
Pfeil 2.2 Grundlagen der C#-Syntax
Pfeil 2.2.1 Kennzeichnen, dass eine Anweisung abgeschlossen ist
Pfeil 2.2.2 Anweisungs- und Gliederungsblöcke
Pfeil 2.2.3 Kommentare
Pfeil 2.2.4 Die Groß- und Kleinschreibung
Pfeil 2.2.5 Die Struktur einer Konsolenanwendung
Pfeil 2.3 Variablen und Datentypen
Pfeil 2.3.1 Variablendeklaration
Pfeil 2.3.2 Der Variablenbezeichner
Pfeil 2.3.3 Der Zugriff auf eine Variable
Pfeil 2.3.4 Ein- und Ausgabemethoden der Klasse »Console«
Pfeil 2.3.5 Die einfachen Datentypen
Pfeil 2.3.6 Typkonvertierung
Pfeil 2.4 Operatoren
Pfeil 2.4.1 Arithmetische Operatoren
Pfeil 2.4.2 Vergleichsoperatoren
Pfeil 2.4.3 Logische Operatoren
Pfeil 2.4.4 Bitweise Operatoren
Pfeil 2.4.5 Zuweisungsoperatoren
Pfeil 2.4.6 Stringverkettung
Pfeil 2.4.7 Sonstige Operatoren
Pfeil 2.4.8 Operator-Vorrangregeln
Pfeil 2.5 Datenfelder (Arrays)
Pfeil 2.5.1 Die Deklaration und Initialisierung eines Arrays
Pfeil 2.5.2 Der Zugriff auf die Array-Elemente
Pfeil 2.5.3 Mehrdimensionale Arrays
Pfeil 2.5.4 Festlegen der Array-Größe zur Laufzeit
Pfeil 2.5.5 Bestimmung der Array-Obergrenze
Pfeil 2.5.6 Die Gesamtanzahl der Array-Elemente
Pfeil 2.5.7 Verzweigte Arrays
Pfeil 2.6 Kontrollstrukturen
Pfeil 2.6.1 Die »if«-Anweisung
Pfeil 2.6.2 Das »switch«-Statement
Pfeil 2.7 Programmschleifen
Pfeil 2.7.1 Die »for«-Schleife
Pfeil 2.7.2 Die »foreach«-Schleife
Pfeil 2.7.3 Die »do«- und die »while«-Schleife

Rheinwerk Computing - Zum Seitenanfang

2.4 OperatorenZur nächsten Überschrift

Im vorhergehenden Abschnitt haben wir uns eingehend mit den Daten auseinandergesetzt. Nun werden Sie lernen, wie Daten mit C# verarbeitet werden können. Bevor wir uns an die Details begeben, müssen wir uns zunächst mit der Terminologie befassen.

An oberster Stelle steht der Begriff Ausdruck. Ein Ausdruck ist die kleinste ausführbare Einheit eines Programms und setzt mindestens einen Operator voraus. Im einfachsten Fall gilt schon die Anweisung

value = 22;

als Ausdruck. Ein Ausdruck wird immer aus mindestens einem Operanden und einem Operator gebildet. Der Operator im Beispiel oben ist der Zuweisungsoperator, als Operand gilt sowohl die Konstante 22 als auch die Variable value. Operatoren verknüpfen Operanden miteinander und führen Berechnungen durch. Nahezu alle Operatoren von C# benötigen zwei Operanden. Das Kernkonstrukt von Ausdrücken sind die Operatoren, die sich entsprechend ihrer Arbeitsweise in verschiedene Gruppen aufteilen lassen:

  • arithmetische Operatoren
  • Vergleichsoperatoren
  • logische Operatoren
  • bitweise Operatoren
  • Zuweisungsoperatoren
  • sonstige Operatoren

Rheinwerk Computing - Zum Seitenanfang

2.4.1 Arithmetische OperatorenZur nächsten ÜberschriftZur vorigen Überschrift

C# kennt die üblichen Operatoren der vier Grundrechenarten Addition, Subtraktion, Division und Multiplikation. Darüber hinaus werden von dieser Gruppe noch weitere Operatoren beschrieben, die in ihrem Kontext eine besondere Bedeutung haben. Tabelle 2.6 gibt zunächst einen allgemeinen Überblick.

Tabelle 2.6 Arithmetische Operatoren

Operator Beschreibung

+

Hat zwei Funktionalitäten:

  • Als Additionsoperator bildet er die Summe zweier Operanden (x + y).
  • Als Vorzeichenoperator beschreibt er eine positive Zahl (+x), ist also ein einstelliger (unärer) Operator.

-

Hat ebenfalls zwei Funktionalitäten:

  • Als Subtraktionsoperator bildet er die Differenz zweier Operanden (x - y).
  • Als unärer Vorzeichenoperator beschreibt er eine negative Zahl (-x).

*

Multiplikationsoperator; multipliziert zwei Operanden (x * y).

/

Divisionsoperator; dividiert zwei Operanden (x / y), behält den Nachkommateil der Division.

%

Restwertoperator; dividiert zwei Operanden und liefert als Ergebnis den Restwert der Operation (x % y).

++

Erhöht den Inhalt des Operanden um 1. Das Ergebnis der Operation ++x ist der Wert des Operanden nach der Erhöhung. Das Ergebnis der Operation x++ ist der Wert des Operanden vor der Erhöhung.

--

Verringert den Inhalt des Operanden um 1. Das Ergebnis der Operation --x ist der Wert des Operanden nach der Verringerung. Das Ergebnis der Operation x-- ist der Wert des Operanden vor der Verringerung.

Der Einsatz der Operatoren zur Formulierung mathematischer Ausdrücke ist trivial. Zwei Operanden werden miteinander verknüpft, und das Ergebnis der Operation wird der links vom Zuweisungsoperator stehenden Variablen zugewiesen.

int value1 = 30;
int value2 = 55;
int result = value1 + value2;

Eine besondere Stellung nimmt der %-Operator ein, dessen Ergebnis einer Division der ganzzahlige Divisionsrest ist. Dazu ein Beispiel:

int x = 100;
int y = 17;
Console.WriteLine("Division mit % - Ergebnis = {0}", x % y);

Die Zahl 17 ist fünfmal in der Zahl 100 enthalten. Damit lautet die Konsolenausgabe 15.

Dezimalzahlen als Operanden des %-Operators sind ebenfalls zugelassen, die Rückgabe ist dabei selbst eine Dezimalzahl:

float x = 100.35F;
float y = 17.45F;
Console.WriteLine("Division mit % - Ergebnis = {0}", x % y);

Wenn Sie diesen Code ausführen, wird im Konsolenfenster die Ausgabe 13,09999 erscheinen.

Widmen wir uns jetzt noch einem Beispiel, an dem die Arbeitsweise der Inkrement- bzw. Dekrementoperationen ersichtlich wird. Zunächst betrachten wir das Codefragment einer Postfixinkrementoperation:

int x = 5;
int y = x++;
// y hat den Inhalt 5 nach der Ausführung der Operation

Zuerst wird der Variablen x der Wert 5 zugewiesen. Im zweiten Schritt wird der aktuelle Inhalt von x an y übergeben und danach der Inhalt der Variablen x um eins erhöht. Nach Beendigung der zweiten Anweisung weist x den Inhalt 6 auf und y den Inhalt 5.

Ein abweichendes Ergebnis erhalten wir, wenn wir den ++-Operator als Präfixinkrementoperator einsetzen.

int a = 5;
int b = ++a;
// b hat den Inhalt 6

In diesem Fall wird zuerst der Inhalt der Variablen a um eins erhöht, und erst danach erfolgt die Zuweisung an die Variable b. Die Folge ist, dass b denselben Inhalt wie a hat.

Vielleicht wird Ihnen aufgefallen sein, dass Tabelle 2.6 keinen Potenzoperator beschreibt. Das ist keine Unterlassungssünde des Autors, da C# tatsächlich keinen bereitstellt. Stattdessen gibt es in der .NET-Klassenbibliothek eine Klasse namens Math, die diverse Methoden für mathematische Operationen bereitstellt, unter anderem auch die Methode Pow zum Potenzieren. Wollen Sie beispielsweise das Ergebnis von 25 berechnen, müssen Sie Folgendes codieren:

double value = Math.Pow(2, 5);

Besonderheiten einer Division

Bei einer Division zweier ganzer Zahlen gibt es einen Haken, der im ersten Moment nicht offensichtlich ist. Betrachten Sie dazu die beiden folgenden Anweisungen:

double value = 3/4;
Console.WriteLine(value);

An der Konsole wird nicht, wie zu erwarten wäre, das Ergebnis 0,75 angezeigt, sondern 0. Die Begründung dieses Phänomens ist recht einfach. Zur Laufzeit muss für die beiden Literale 3 und 4 Speicher reserviert werden. Die Laufzeitumgebung erkennt, dass es sich um ganze Zahlen handelt, und interpretiert den Typ der beiden Literale jeweils als Integer. Das Ergebnis der Division wird vor der endgültigen Zuweisung an value zwischengespeichert. Dazu wird Speicher reserviert, der dem Typ des größten der beiden beteiligten Operanden entspricht, mit der Folge, dass der Dezimalteil des Ergebnisses abgeschnitten wird. Bei der anschließenden Zuweisung an value ist das Kind bereits in den Brunnen gefallen – das Ergebnis ist falsch.

Zur Lösung dieser Problematik muss sichergestellt werden, dass einer der beiden Operanden als Dezimalzahl erkannt wird. Sie können das erreichen, indem Sie beispielsweise

double value = 3.0/4;

schreiben. Die Zahl 3 wird jetzt nicht mehr als Integer, sondern als double verarbeitet. Dieser Typ ist erfreulicherweise in der Lage, auch Nachkommastellen aufzunehmen, und das Ergebnis wird korrekt angezeigt.

Eine andere Möglichkeit wäre es, einen der Operanden explizit in eine Dezimalzahl zu konvertieren:

double value = (double)3 / 4;

Rheinwerk Computing - Zum Seitenanfang

2.4.2 VergleichsoperatorenZur nächsten ÜberschriftZur vorigen Überschrift

Vergleichsoperatoren vergleichen zwei Ausdrücke miteinander. Der Rückgabewert ist immer ein boolescher Wert, also entweder true oder false. Vergleiche können auf Gleichheit bzw. Ungleichheit sowie auf »größer« und »kleiner« durchgeführt werden.

Tabelle 2.7 Vergleichsoperatoren

Operator Beschreibung

a == b

(Vergleichsoperator) prüft, ob der Ausdruck a dem Ausdruck b entspricht, und gibt in diesem Fall true zurück.

a != b

Ergebnis der Operation ist true, wenn a ungleich b ist.

a > b

Ergebnis der Operation ist true, wenn a größer b ist.

a < b

Ergebnis der Operation ist true, wenn a kleiner b ist.

a <= b

Ergebnis der Operation ist true, wenn a kleiner oder gleich b ist.

a >= b

Ergebnis der Operation ist true, wenn a größer oder gleich b ist.

Sehen wir uns einige boolesche Ausdrücke an:

bool compare;
compare = value <= 100;

Vergleichsoperatoren genießen eine höhere Priorität als der Zuweisungsoperator, daher wird zuerst der Teilausdruck value <= 100 ausgewertet. Das Ergebnis des Vergleichs, je nachdem, ob der Vergleich wahr oder falsch ist, wird der Variablen compare zugewiesen. Sie können die boolesche Operation auch direkt zur Initialisierung bei der Deklaration verwenden:

bool compare = intVar <= 100;

Mit den Vergleichsoperatoren lassen sich auch die Inhalte von zwei string-Variablen miteinander vergleichen:

string text1 = "Hallo";
string text2 = "hallo";
bool compare = text1 == text2;

Der Rückgabewert wird in diesem Fall false sein, weil beim Vergleich von Zeichenketten der Groß-/Kleinschreibung Beachtung geschenkt wird.


Rheinwerk Computing - Zum Seitenanfang

2.4.3 Logische OperatorenZur nächsten ÜberschriftZur vorigen Überschrift

C# bietet eine Reihe logischer Operatoren an, die ebenfalls als Resultat einen booleschen Wert liefern. Sehen wir uns zunächst die folgende Tabelle an, bevor wir uns an einigen Beispielen die Wirkungsweise dieser Operatoren verdeutlichen.

Tabelle 2.8 Logische Operatoren

Operator Beschreibung

!

Unärer Negationsoperator. Der Ausdruck

!a

ist true, wenn a einen unwahren Wert beschreibt, und false, wenn a wahr ist.

&

(And-Operator, 1. Variante) Der Ausdruck

a & b

ist dann true, wenn sowohl a als auch b true sind. Dabei werden in jedem Fall beide Ausdrücke ausgewertet.

|

(Or-Operator, 1. Variante) Der Ausdruck

a | b

ist true, wenn entweder a oder b wahr ist. Dabei werden in jedem Fall beide Ausdrücke ausgewertet.

^

(Xor-Operator) Der Ausdruck

a ^ b

ist true, wenn die beiden beteiligten Operanden unterschiedliche Wahrheitswerte haben.

&&

(And-Operator, 2. Variante) Der Ausdruck

a && b

ist true, wenn sowohl a als auch b true sind. Zuerst wird a ausgewertet. Sollte a false sein, ist in jedem Fall der Gesamtausdruck unabhängig von b auch falsch. b wird dann nicht mehr ausgewertet.

||

(Or-Operator, 2. Variante) Der Ausdruck

a || b

ist true, wenn entweder a oder b true ist. Zuerst wird a ausgewertet. Sollte a bereits true sein, ist in jedem Fall der Gesamtausdruck unabhängig von b auch wahr. b wird dann nicht mehr ausgewertet.

Das Ergebnis einer Operation, an der logische Operatoren beteiligt sind, lässt sich am besten anhand einer Wahrheitstabelle darstellen.

Tabelle 2.9 Wahrheitstabellen

Bedingung 1 Bedingung 2 And-Operator Or-Operator Xor-Operator

false

false

false

false

false

true

false

false

true

true

false

true

false

true

true

true

true

true

true

false

Sehr häufig werden logische Operatoren benutzt, wenn eine Entscheidung darüber getroffen werden muss, welcher Programmcode in Abhängigkeit vom Ergebnis einer Bedingungsprüfung ausgeführt werden soll:

if(x != y)
Console.WriteLine("x ist ungleich y");

In diesem einfachen Beispiel, das auch ohne größere Erklärung verständlich sein dürfte, wird die WriteLine-Methode dann ausgeführt, wenn die Bedingung

x != y

erfüllt ist, also true liefert.

Bedingungen können durchaus auch komplexer werden und neben logischen Operatoren auch mehrere Vergleichsoperatoren enthalten. Betrachten wir das folgende Codefragment:

if(x < 5 || y > 20)
Console.WriteLine("Bedingung ist erfüllt");

Dieses Codefragment enthält drei verschiedene Operatoren. Da stellt sich sofort die Frage, in welcher Reihenfolge sie zur Bildung des Gesamtergebnisses herangezogen werden. Von den drei Operatoren hat der ||-Operator die geringste Priorität, < und > sind in dieser Hinsicht gleichwertig (siehe auch Abschnitt 2.4.8). Folglich wird zuerst das Ergebnis aus

x < 5 

gebildet und danach das aus:

y > 20 

Beide Teilergebnisse sind entweder true oder false und werden am Schluss mit || verglichen, woraus das Resultat gebildet wird. Manchmal ist es allerdings wegen der besseren Les- und Interpretierbarkeit einer komplexen Bedingung durchaus sinnvoll, auch unnötige Klammerpaare zu setzen:

if((x < 5) || (y > 20))

Interessant sind insbesondere die ähnlichen Paare & und && bzw. | und ||. Um die Unterschiede in der Verhaltensweise genau zu verstehen, wollen wir ein kleines Beispielprogramm entwickeln, das auch syntaktische Elemente enthält, die bisher noch nicht unser Thema waren.

// Beispiel: ..\Kapitel 2\LogischeOperatoren  
class Program {
static void Main(string[] args){
int x = 8;
int y = 9;
// wenn die Bedingung wahr ist, dann dies durch eine
// Ausgabe an der Konsole bestätigen
if((x != y) | DoSomething())
Console.WriteLine("Bedingung ist erfüllt");
Console.ReadLine();
}
// benutzerdefinierte Methode
static bool DoSomething() {
Console.WriteLine("Aufruf der TestFunction");
return true;
}
}

Listing 2.17 Testen einer komplexeren Bedingungsprüfung

Neu ist in diesem Beispiel die Definition einer Methode, die hier DoSomething heißt. DoSomething macht nicht sehr viel: Sie schreibt nur eine Meldung in das Konsolenfenster und gibt immer den booleschen Wert true als Ergebnis des Aufrufs zurück. In Main werden den beiden Variablen x und y feste Werte zugewiesen. Daraus folgt, dass die Bedingung

x != y 

immer wahr ist. Verknüpft wird diese Bedingung über den Oder-Operator | mit dem Aufruf der benutzerdefinierten Funktion. Da diese einen booleschen Wert zurückliefert, ist der Code syntaktisch korrekt. Führen wir das Programm aus, wird an der Konsole

Aufruf der TestFunction
Bedingung ist erfüllt

angezeigt. Halten wir an dieser Stelle die folgende Tatsache fest: Zwei Ausdrücke sind mit dem Oder-Operator | verknüpft. Beide Bedingungen werden vollständig geprüft, bevor das Gesamtergebnis der Operation feststeht. Aus der Wahrheitstabelle (Tabelle 2.9) können wir aber entnehmen, dass die Gesamtbedingung in jedem Fall true ist, wenn einer der beiden Ausdrücke wahr ist. Folglich wäre es auch vollkommen ausreichend, nach dem Prüfen der Bedingung x != y die zweite Bedingung keiner eigenen Überprüfung zu unterziehen, da das Endergebnis bereits feststeht. Hier betritt nun der zweite Oder-Operator (||) die Bühne. Wenn wir die Bedingung nun mit

if((x != y) || DoSomething())

formulieren, lautet die Ausgabe an der Konsole nur noch:

Bedingung ist erfüllt

Der Wahrheitsgehalt der zweiten Bedingung wird erst gar nicht mehr überprüft, da er das Endergebnis nicht mehr beeinflussen kann. Genauso arbeiten auch die beiden Operatoren »&« und »&&«.

In der Praxis kann diesem Unterschied große Bedeutung hinsichtlich der Performance einer Anwendung zukommen. Wenn nämlich die zweite Bedingung eine länger andauernde Ausführungszeit für sich beansprucht und das Ergebnis der ersten Operation die Prüfung der zweiten Bedingung unnötig macht, leisten || bzw. && durchaus einen kleinen Beitrag zur Verbesserung der Gesamtleistung.


Rheinwerk Computing - Zum Seitenanfang

2.4.4 Bitweise OperatorenZur nächsten ÜberschriftZur vorigen Überschrift

Bitweise Operatoren dienen dazu, auf die Bitdarstellung numerischer Operanden zuzugreifen. Dabei kann die Bitdarstellung eines numerischen Operanden sowohl abgefragt als auch manipuliert werden.

Tabelle 2.10 Bitweise Operatoren

Operator Beschreibung

~

Invertiert jedes Bit des Ausdrucks (Einerkomplement).

|

Aus x|y resultiert ein Wert, bei dem die korrespondierenden Bits von x und y
Or-verknüpft werden.

&

Aus x&y resultiert ein Wert, bei dem die korrespondierenden Bits von x und y And-verknüpft werden.

^

Aus x^y resultiert ein Wert, bei dem die korrespondierenden Bits von x und y
Xor-verknüpft werden.

<<

Aus x<<y resultiert ein Wert, der durch die Verschiebung der Bits des ersten Operanden x um die durch die im zweiten Operanden y angegebene Zahl nach links entsteht.

>>

Aus x>>y resultiert ein Wert, der durch die Verschiebung der Bits des ersten Operanden x um die durch die im zweiten Operanden y angegebene Zahl nach rechts entsteht.

Beachten Sie bitte, dass die Operatoren & und | sowohl als Vergleichsoperatoren als auch als bitweise Operatoren eingesetzt werden können. Als Vergleichsoperatoren werden zwei boolesche Operanden miteinander verglichen, ein Wahrheitswert wird als Ergebnis der Operation zurückgeliefert, und die bitweisen Operatoren vergleichen die einzelnen Bits einer Speicheradresse und bilden daraus das Ergebnis. Wir sehen uns jetzt an einigen Beispielen an, wie diese Operatoren eingesetzt werden können.

Beispiel 1: Im Folgenden werden die beiden Literale 13 und 5 mit dem bitweisen &-Operator verknüpft:

a = 13 & 5;
Console.WriteLine(a);

Die Bitdarstellung dieser beiden Literale sieht wie folgt aus:

13 = 0000 0000 0000 1101
5 = 0000 0000 0000 0101

An der Konsole wird als Ergebnis die Zahl 5 angezeigt, was der Bitdarstellung

0000 0000 0000 0101

entspricht. Wir können unser Ergebnis auch wie folgt interpretieren:

Eine vorgegebene Bitsequenz kann mit dem bitweisen &-Operator daraufhin untersucht werden, ob die vom rechten Operanden beschriebenen Bits in der vorgegebenen Bitfolge gesetzt sind. Das ist genau dann der Fall, wenn das Ergebnis der &-Verknüpfung dasselbe Ergebnis liefert wie im rechtsseitigen Operanden angegeben.

Beispiel 2: Verknüpfen wir nun zwei Literale mit dem bitweisen Oder-Operator |, also beispielsweise:

int a = 71 | 49;
Console.WriteLine(a);

Die Bitdarstellung dieser beiden Literale sieht wie folgt aus:

71 = 0000 0000 0100 0111
49 = 0000 0000 0011 0001

Das Ergebnis wird 119 lauten oder in Bitdarstellung:

0000 0000 0111 0111

Beispiel 3: Dem Xor-Operator ^ kommt ebenfalls eine ganz besondere Bedeutung zu, wie das folgende Beispiel zeigt:

int a = 53;
a = a ^ 22;
Console.WriteLine(a);

Sehen wir uns zunächst wieder die durch die beiden Literale beschriebenen Bitsequenzen an:

53 = 0000 0000 0011 0101
22 = 0000 0000 0001 0110

Lassen wir uns das Ergebnis an der Konsole anzeigen, wird 35 ausgegeben. Das entspricht folgender Bitfolge:

0000 0000 0010 0011

Hier wird also das zweite, dritte und das fünfte Bit des linken Operanden invertiert – so wie es der rechte Operand vorgibt. Analysieren wir das Ergebnis, kommen wir zu der folgenden Merkregel:

In einer vorgegebenen Bitsequenz können ganz bestimmte Bits mit dem bitweisen ^-Operator invertiert werden. Die Ausgangsbitfolge steht links vom Operator, und die Zahl, die die Bits repräsentiert, die invertiert werden sollen, steht rechts vom Operator.

Wenden wir auf das Ergebnis ein zweites Mal den ^-Operator an, also

int a = 53;
a = a ^ 22;
a = a ^ 22;

wird die Variable a wieder den ursprünglichen Wert 53 beinhalten.

Beispiel 4: Zum Abschluss nun noch ein Beispiel mit dem Verschiebeoperator »<<«. Die Bits der Zahl 37 sollen um zwei Positionen nach links verschoben werden, und die Anzeige soll sowohl im Dezimal- als auch im Hexadezimalformat erfolgen.

c = 37 << 2;
Console.WriteLine("dezimal : {0}",c);
Console.WriteLine("hexadezimal: 0x{0:x}",c);

Die Zahl 37 entspricht der Bitdarstellung:

0000 0000 0010 0101

Nach der Verschiebung um die geforderten zwei Positionen nach links ergibt sich:

0000 0000 1001 0100

was wiederum der Zahl 148 oder in hexadezimaler Schreibweise 0x94 entspricht, was uns auch die Laufzeitumgebung bestätigt.

Mit

c = 37 >> 2;

lautet das Ergebnis 9, was zu der folgenden Aussage führt:

Bei der Bitverschiebung eines positiven Operanden mit dem <<- oder >>-Operator werden die frei werdenden Leerstellen mit 0-Bits aufgefüllt.


Rheinwerk Computing - Zum Seitenanfang

2.4.5 ZuweisungsoperatorenZur nächsten ÜberschriftZur vorigen Überschrift

Bis auf die Ausnahme des einfachen Gleichheitszeichens dienen alle anderen Zuweisungsoperatoren zur verkürzten Schreibweise einer Anweisung, bei der der linke Operand einer Operation gleichzeitig auch der Empfänger des Operationsergebnisses ist.

Tabelle 2.11 Zuweisungsoperatoren

Operator Beschreibung

=

x = y weist x den Wert von y zu.

+=

x += y weist x den Wert von x + y zu.

-=

x -= y weist x den Wert von x - y zu.

*=

x *= y weist x den Wert von x * y zu.

/=

x /= y weist x den Wert von x / y zu.

%=

x %= y weist x den Wert von x % y zu.

&=

x &= y weist x den Wert von x & y zu.

|=

x |= y weist x den Wert von x | y zu.

^=

x ^= y weist x den Wert von x ^ y zu.

<<=

x <<= y weist x den Wert von x << y zu.

>>=

x >>= y weist x den Wert von x >> y zu.


Rheinwerk Computing - Zum Seitenanfang

2.4.6 StringverkettungZur nächsten ÜberschriftZur vorigen Überschrift

Den +-Operator haben Sie bereits in Verbindung mit arithmetischen Operationen kennengelernt. Ihm kommt allerdings auch noch eine zweite Aufgabe zu, nämlich die Verkettung von Zeichenfolgen. Ist wenigstens einer der beiden an der Operation beteiligten Operanden vom Typ string, bewirkt der +-Operator eine Stringverkettung. Bei Bedarf wird der Operand, der nicht vom Typ string ist, implizit in einen solchen konvertiert. Das Ergebnis der Stringverkettung ist wieder eine Zeichenfolge. Nachfolgend finden Sie einige Codefragmente, die Beispiele für Stringverkettungen zeigen.

string text1 = "Leckere";
string text2 = "Suppe";
// text3 hat den Inhalt "leckere Suppe"
string text3 = text1 + " " + text2;
int value = 4711;
string text = "Hallo";
// text hat den Inhalt "Hallo4711"
text += value;
string text1 = "4";
string text2 = "3";
// an der Konsole wird "43" ausgegeben
Console.WriteLine(text1 + text2);

Rheinwerk Computing - Zum Seitenanfang

2.4.7 Sonstige OperatorenZur nächsten ÜberschriftZur vorigen Überschrift

Wir sind noch nicht am Ende der Aufzählung der Operatoren von C# angelangt. Es stehen dem Entwickler noch einige besondere Operatoren zur Verfügung, mit denen Sie in den vorhergehenden Abschnitten teilweise auch schon gearbeitet haben oder die Sie im weiteren Verlauf dieses Buches noch kennenlernen werden. Der Vollständigkeit halber sind die Operatoren dieser Gruppe in Tabelle 2.12 aufgeführt.

Tabelle 2.12 Sonstige C#-Operatoren

Operator Beschreibung

.

Der Punktoperator wird für den Zugriff auf die Eigenschaften oder Methoden einer Klasse verwendet, z. B. Console.ReadLine();

[]

Der []-Operator wird für Arrays, Indexer und Attribute verwendet, z. B. arr[10]

()

Der ()-Operator dient zwei Zwecken: Er gibt die Reihenfolge der Operationen vor und wird auch zur Typkonvertierung eingesetzt.

?:

Der ?:-Operator gibt einen von zwei Werten in Abhängigkeit von einem dritten zurück. Er ist eine einfache Variante der if-Bedingungsprüfung.

new

Dient zur Instanziierung einer Klasse.

is

Prüft den Laufzeittyp eines Objekts mit einem angegebenen Typ.

typeof

Ruft das System.Type-Objekt für einen Typ ab.

checked / unchecked

Steuert die Reaktion der Laufzeitumgebung bei einem arithmetischen Überlauf.


Rheinwerk Computing - Zum Seitenanfang

2.4.8 Operator-VorrangregelnZur vorigen Überschrift

Enthält ein Ausdruck mehrere Operatoren, entscheiden die Operator-Vorrangregeln über die Reihenfolge der Ausführung der einzelnen Operationen. In Tabelle 2.13 sind die Operatoren so angeordnet, dass die weiter oben stehenden Vorrang vor den weiter unten stehenden haben.

Tabelle 2.13 Operator-Vorrangregeln

Gruppe Operator

1

x.y (Punktoperator), a[x], x++, x--, new, typeof, checked, unchecked

2

+ (unär), - (unär), !, ~, ++x, --x, (<Typ>)x

3

*, /, %

4

+ (additiv), - (subtraktiv)

5

<<, >>

6

<, >, <=, >=, is

7

==, !=

8

&

9

^

10

|

11

&&

12

||

13

?:

14

=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual C# 2012

Visual C# 2012
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: C/C++






 C/C++


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2013
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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern