Glossar
·
Hauptseite
·
Zufälliger Artikel
·
Portal liste
Diskussion
·
Diskussion : Syntax von C-Sharp
Webkatalog
·
Übersicht
·
Eigene Artikel
·
Seite vorschlagen
Aktuelles
·
Seite der Woche
·
Newsletter
·
Today in History
·
Kreuzworträtsel
Weitere Inhalte
·
Einkaufsmeile
·
Begriffslexikon
·
Multimedia
Suche
·
Geschi.de
·
nach Jahren
·
Weltchronik.de
·
Geschichtsreferate
Interna
·
Seitenneuigkeiten
·
Hilfe zur Seite
·
Impressum
Jahres-Sprung
Jahreszahl eingeben:
>
Chronik2000-Homepage
<
Syntax von C-Sharp
Stichpunkte
Allgemein
foreach) 1.4 Die Sprungbefehle break
continue
set und value) 1.9.4 Darstellung spezieller Zeichen oder Zeichenfolgen 1.10 Vererbung 1.10.1 Schnittstellen 1.10.2 Das Schlüsselwort base 1.10.3 Versiegelte Klassen 1.11 Typumwandlungen 1.12 Assemblies 1.13 Attribute (Metadaten) 1.14 Kommentare und Dokumentation 2 Verfügbare Klassenbibliotheken [Bearbeiten]
while
Eigenschaften und Konstanten 1.9.1 Datentypen und Speicherbedarf 1.9.2 Konstanten (Schlüsselwort const) 1.9.3 Eigenschaften (Schlüsselwörter get
Dieser Artikel geht auf die Sprachelemente von C# ein. Inhaltsverzeichnis showTocToggle("Anzeigen"
"Verbergen") 1 Sprachelemente 1.1 Schlüsselwörter 1.2 Bedingte Ausführung (if
do
else) 1.3 Schleifen (for
goto und return 1.5 Objekte und Klassen 1.5.1 Die Klasse namens "object" 1.6 Strukturen (struct) 1.7 Aufzählungen (Enumerationen) 1.7.1 Flags 1.8 Zugriffsmodifikatoren 1.9 Datentypen
Sprachelemente
[Bearbeiten]
Schlüsselwörter
abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while [Bearbeiten]
Bedingte Ausführung (if, else)
if (Bedingung) { Anweisungen; } [else if (Bedingung) { Anweisungen; }] [else { Anweisungen; }] [Bearbeiten]
Schleifen (for, do, while, foreach)
for (Startausdruck; Gültigkeitsbedingung; Inkrementierungsausdruck) { Anweisungen; } Die Bedingung der While-Schleife wird immer vor dem Anweisungsblock ausgeführt
Wenn die Bedingung von Anfang an nicht erfüllt ist
wird die Schleife also nicht durchlaufen. while (Bedingung) { Anweisungen; } Die Bedingung der Do-While-Schleife wird immer nach dem Anweisungsblock ausgeführt
Die Schleife wird daher mindestens ein mal durchlaufen. do { Anweisungen; } while (Bedingung); Mit der foreach-Schleife wird durch alle Mitglieder einer Collection iteriert
In der Schleife besteht nur lesender Zugriff auf die Variable. foreach(Datentyp Variablename in Collection) { Anweisungen; } [Bearbeiten]
Die Sprungbefehle
break
,
continue
,
goto
und
return
for (int i = 0; i < 10; ++i) { if (i < 8) continue; Console.WriteLine("Continue wurde nicht ausgeführt."); } Mit dem Befehl continue wird der nächste Durchlauf einer Schleife veranlasst. (Dabei wird der restliche Code in der Schleife nach dem continue Befehl übersprungen
Im Beispiel wird der Text nur 2 mal ausgegeben. for (int i = 0; i < 100; ++i) { if (i == 5) break; Console.WriteLine(i); } Der Befehl break veranlasst das Programm
die nächste umschließende Schleife (oder switch) zu verlassen
2
In diesem Beispiel werden nur die Zahlen 0
1
3 und 4 ausgegeben. int a = 1; Top: if (a == 5) ++a; goto Top; Console.WriteLine("Ende des Programs") Mit goto springt das Programm an die angegebene Markierung. int result = ImQuadrat(2); static int ImQuadrat(int x) { int a; a = x*x; return a; } Mit return wird die aktuelle Methode verlassen und der im Kopf der Methode vereinbarte Referenz- bzw
Datentyp als Rückgabewert zurückgeliefert
Methoden ohne Rückgabewert werden mit dem Schlüsselwort void gekennzeichnet. [Bearbeiten]
Objekte und Klassen
Wenn man von einem Objekt spricht
handelt es sich dabei in der Umgangssprache normalerweise um ein reales Objekt oder einen Gegenstand des täglichen Lebens
Beispielsweise kann das ein Tier
ein Fahrzeug
ein Konto oder ähnliches sein
Jedes Objekt kann durch verschiedene Attribute beschrieben werden und verschiedene Zustände annehmen und diese auch auslösen. Übertragen auf die objektorierentierte Programmierung und C# ist ein Objekt die Instanz (siehe Schlüsselwort new) einer Klasse
Eine Klasse kann man dabei als Bauplan oder Gerüst eines Objektes ansehen
Eine Klasse besitzt Eigenschaften (Variablen) bzw
die die Folge von Zuständen sind bzw. diese auslösen. Klasse Attribut(e) Methode(n) Ereignis(se) [Bearbeiten]
Attribute
Methoden (die Zustände/Tätigkeiten darstellen) und Ereignisse
Die Klasse namens "object"
von dem jede Klasse abgeleitet wird
Die Klasse object ist ein Referenztyp
So kann durch explizite Typumwandlung jeder Objekttyp in object umgewandelt werden
Im Unterschied zu anderen Sprachen unterscheidet C# nicht zwischen elementaren Datentypen und Referenztypen
Auch bei elementaren Datentypen handelt es sich in C# um Referenztypen
die von object abgeleitet werden. [Bearbeiten]
Strukturen (
struct
)
Strukturen sind bereits als Sprachmittel aus Sprachen wie C++ oder Delphi (Records) bekannt
Sie dienen primär zur Erstellung eigener komplexer Datenstrukturen oder eigener Datentypen
double z) { this.x = x; this.y = y; this.z = z; } public override string ToString() { return(string.Format("x: {0}
x
z: {2}"
durch eine Datenstruktur Koordinate abgebildet werden
y
einer Y- und einer Z-Position
double y
die sich aus drei Gleitkommazahlen einfacher oder doppelter Genauigkeit zusammensetzt. public struct Koordinate { public double x; public double y; public double z; public Koordinate(double x
y: {1}
bestehend aus einer X-
So kann zum Beispiel eine Raumkoordinate
z)); } } C# fasst eine über das Schlüsselwort struct definierte Struktur als einen Wertetyp auf – anders als beispielsweise C++
Konstruktoren und andere Elemente von Klassen aufweisen; sie können aber nicht beerbt werden
Eigenschaften
Strukturen in C# können außerdem Methoden
Der Unterschied einer Struktur im Vergleich zu einer Klasse besteht in ihrer Repräsentation im Speicher
wie es beim Objekt einer Klasse erforderlich ist (Referenztyp)
Da keine zusätzlichen Speicherreferenzen benötigt werden
können Strukturen wesentlich ressourcenschonender eingesetzt werden
So basieren beispielsweise alle Datentypen in C# auf Strukturen. [Bearbeiten]
Aufzählungen (Enumerationen)
Aufzählungen dienen zur automatischen Nummerierung der in der Aufzählung enthaltenen Elemente
Die Syntax für die Definition von Aufzählungen verwendet das Schlüsselwort enum (Abkürzung für Enumeration)
dass ein optionaler ganzzahliger Datentyp für die Nummerierung der Elemente angegeben werden kann
mit der Ausnahme
Der in C# verwendete Aufzählungstyp ähnelt dem in C++
Aufzählungstypen durch finalisierte statische Attribute in Klassen oder Schnittstellen nachgebildet (ab Java 1.5 sind sie aber auch ein Bestandteil der Sprache Java). public enum Woche { Montag = 1
Donnerstag
im Unterschied zur Sprache C#
Mittwoch
Samstag
Sonntag } Die Elementnummerierung in C# beginnt bei 0
Dienstag
Freitag
Ohne Angabe eines Datentyps wird int verwendet. In Java werden
jedem Element – oder nur dem ersten Element – einen eigenen Startwert zuzuweisen (wie im obigen Beispiel)
Es ist aber auch möglich
wie in C++
Dabei können sich die Anfangswerte wiederholen
Die Zählung beginnt dann jeweils von neuem bei dem definierten Startwert und Element
In C# ist es auch möglich
ein bestimmtes Element einer Enumeration über seine Ordinalzahl anzusprechen
Hierzu ist aber eine explizite Typumwandlung notwendig. Woche Tag = Woche.Mittwoch; System.Console.WriteLine(Tag); // Ausgabe: Mittwoch System.Console.WriteLine((int)Tag); // Ausgabe: 3 System.Console.WriteLine((Woche)3); // Ausgabe: Mittwoch [Bearbeiten]
Flags
Neben der beschriebenen Variante des enum-Aufzählungstyps existiert noch eine spezielle Variante von Enumeration
Flags definieren Enumerationen auf Bitebene und werden durch die Metainformation [Flags] vor der Enum-Deklaration definiert
Flag-Elemente können auf Bitebene verknüpft werden. [Bearbeiten]
Zugriffsmodifikatoren
Variablen
Felder und Ereignisse) in C#
Eigenschaften
Zugriffsmodifikatoren regeln den Zugriff auf Klassen und deren Mitglieder (Methoden
Die folgende Tabelle führt die von C# unterstützten Zugriffsmodifikatoren auf und beschreibt deren Wirkung und den Sichtbarkeitskontext. Name Wirkung internal internal beschränkt den Zugriff auf Klassen und deren Mitglieder auf eine Assembly
andernfalls ist der Zugriff auf den aktuellen Namensraum und dessen Mitglieder beschränkt (unter Java entspricht das der Beschränkung auf ein package). private Beschränkt den Zugriff auf eine Klasse und deren Mitglieder
Im einfachsten Falle ist das die aktuelle Klasse (sofern kein Namensraum (namespace) definiert wurde)
oder die statische Funktion Main
Eine mit private deklarierte Klasse kann nur innerhalb der Klasse selbst instanziert werden (beispielsweise kann ein öffentlicher Konstruktor einer Klasse
der nicht von außen aufgerufen werden kann). Oft wird private verwendet
um das Singelton-Muster umzusetzen (z.B. bei der Verwendung einer Klasse als Fabrik; siehe Fabrikmuster) oder die Vererbung zu beeinflussen oder zu verbieten (siehe auch Schlüsselwort sealed)
einen privaten Konstruktor aufrufen
Hinweis: Eine abgeleitetet Klasse kann auf private Mitglieder der Basisklasse (vgl
Schlüsselwort base) ebenfalls nicht zugreifen
bis auf einen Unterschied
Soll ein solcher Zugriff möglich sein
so muss der Zugriffsmodifizierer protected verwendet werden. protected Dieser Modifikator ist mit dem Modifikator private identisch
können auch abgeleitete Klassen auf die Mitglieder einer Basisklasse (vgl
Sofern die Klasse nicht mit dem Schlüsselwort sealed gegen das Beerben "versiegelt" wurde
Schlüsselwort base) zugreifen oder diese überschreiben
Ansonsten ist die Sichtbarkeit auf die Klasse selbst beschränkt. public Auf als public gekennzeichnete Klasse oder Klassenmitglieder (z.B
kann unbeschränkt zugegriffen werden
Methoden oder Eigenschaften)
Sie werden deshalb auch als "öffentlich" bezeichnet
automatisch als private deklariert
muss immer als public deklariert werden
Eine Klasse die eine statische Funktion Main enthält oder sonstige statische Methoden
da sonst kein Zugriff möglich ist und es zu einem Fehler kommt. Hinweise: Per Voreinstellung sind Klassenmitglieder (Methoden
denen kein Zugriffsmodifikator zugewiesen wurde
Eigenschaften usw.)
Klassen selbst dagegen besitzen automatisch den Modifikator internal und sind nur im aktuellen Namensraum (namespace) sichtbar
Wurde kein Namensraum zugewiesen
so gilt der so genannte globale Deklarationsraum als Standardnamensraum. Die Modifikatoren können bis auf protected und internal nicht miteinander kombiniert werden. protected internal spielt im Zusammenhang mit der Vererbung von Komponenten eine Rolle
Die Sichtbarkeit der Basisklasse wird von der abgeleiteten Klasse übernommen. Schnittstellen sind immer öffentlich definiert
Die Zuordnung eines Zugriffsmodifikators (mit Ausnahme von public) ist nicht zulässig. [Bearbeiten]
Datentypen, Eigenschaften und Konstanten
C# kennt zwei Arten von Datentypen: Wertetypen und Referenztypen
wie sie u.a. aus der Sprache C++ bekannt sind
Referenztypen dürfen dabei nicht mit Zeigern gleichgesetzt werden
Diese werden von C# auch unterstützt
aber nur im "unsicheren Modus" (engl. unsafe mode)
wobei Referenztypen im Gegensatz dazu nur Verweise auf die eigentlichen Daten
oder besser
Wertetypen enthalten die Daten direkt
Objekte darstellen
Beim Lesen und Schreiben von Wertetypen werden die Daten dagegen über einen Automatimus
Autoboxing genannt
in einer Instanz der jeweiligen Hüllenklasse (engl. wrapper) gespeichert oder aus ihr geladen
Die Zuweisung eines Wertes bzw. einer Referenz kann während der Deklaration erfolgen oder später
sofern die Variable nicht als Konstante deklariert wurde
k; i = j = k = 123; Einen Sonderfall der Zuweisung stellt die Deklaration von Feldern (Arrays) dar
...; int i
k = 3; System.Collections.IList liste = new System.Collections.ArrayList(); Auch die Mehrfachzuweisung eines Wertes an verschiedene Variablen ist möglich: int i
j
j
Die Deklaration erfolgt durch Angabe eines Datentyps gefolgt von einem Variablennamen: // Datentyp Variable; int i; System.Collections.IList liste; Es können auch mehrere Variablen des gleichen Typs zeitgleich deklariert werden: // Datentyp Variable1
der Variablen bei der Deklaration auch gleich einen Wert oder eine Referenz zuzuweisen (Initialwert): // Datentyp Variable=Wert/Referenz; int i = 5; int j = 2
k; System.Collections.IList liste1
Variable2
liste2; Ferner besteht die Möglichkeit
Näheres hierzu im entsprechenden Abschnitt. [Bearbeiten]
Datentypen und Speicherbedarf
Datentyp Bit Vorz. Hüllenklasse (struct type) bool 1 - System.Boolean byte 8 J System.Byte char 16 - System.Char decimal 128 - System.Decimal double 64 - System.Double float 32 - System.Single int 32 J System.Int32 long 64 J System.Int64 sbyte 8 J System.SByte short 16 J System.Int16 uint 32 N System.UInt32 ulong 64 N System.UInt64 ushort 16 N System.UInt16 Datentypen sind in C# nicht elementar
sondern objektbasiert
Jeder der in der Tabelle aufgeführten Datentypen stellt einen Alias auf eine Klasse des Namensraumes System dar
Beispielsweise wird der Datentyp bool durch die Klasse System.Boolean abgebildet
Man spricht dabei auch von einer Hüllenklasse (engl. wrapper class)
Methoden auf Datentypen anzuwenden
und anders als bei Java
Durch die Objektbasiertheit ist es möglich
die die entsprechende Hüllenklasse bereitstellt: 1234.ToString();int i = 17;i.ToString(); Vergleichbar mit C++
gibt es unter C# vorzeichenbehaftete und vorzeichenlose Datentypen
ushort
uint
Diese werden durch Voranstellen des Buchstabens s (für signed
ulong
englisch für vorzeichenlos) gekennzeichnet (sbyte
englisch für vorzeichenbehaftet) und durch Voranstellen des Buchstabens u (für unsigned
mit Ausnahme von short)
Die Fließkomma- bzw
double
Gleitkomma-Datentypen (float
decimal) können neben einfacher auch doppelte Genauigkeit aufweisen und haben einen variierenden Speicherbedarf
Dadurch ändert sich die Genauigkeit
was in der Anzahl der möglichen Nachkommastellen zum Ausdruck kommt. [Bearbeiten]
Konstanten (Schlüsselwort
const
)
Einem mit const deklarierten "Objekt" kann nach der Deklaration und Initialisierung kein neuer Inhalt zugewiesen werden
von welchem der Compiler feststellen kann ob er auch konstant ist
Das "Objekt" wird dadurch zu einer Konstanten. Eine Konstante kann dabei nur ein von einem Typ sein
Dies geht bei allen Grunddatentypen die der Compiler versteht
sowie allen Enums
Bei allen anderen Wertdatentypen (Structs) sowie Referenzetypen ist eine Deklaration einer Variablen als const<code> nicht möglich
Grund dafür ist
dass der Compiler alle Verwendungen zum Zeitpunkt des Kompelieren ersetzt
Bei Referenzedatentypen müsste er dort bereits die Speicheraddresse zur Laufzeit wissen
fm); //Daten Lesen fs.Read(readBuffer
Strukturen könnten ebenfalls nicht konstant sein
welche die Zugriffart auf eine Datei beschreibt (Enum) const FileMode fa = FileMode.Open; //Es wird eine Konstante festgelegt
da sie in einem Konstruktor einen Zufallsgenerator benutzen könnten. Fehlerhafte Zuweisungen einer Konstanten werden mit dem Kompilerfehler CS0133 vom C-Sharpkompiler moniert. <code> using System; using System.IO; public class ConstBeispiel { public static void Main() { //Es wird eine Konstante für die Länge eines Arrays angelegt const int arrayLength = 1024; //Es wird eine Konstante festgelegt
welcher der C# Kompiler nicht kennt const TimeSpan zeitSpanne = new TimeSpan(10); } } Konstanten gibt es auch in anderen Sprachen (z.B
welche den Namen der zu öffnende Datei festlegt const string fileName = "beispiel.txt"; //Buffer erstellen byte[] readBuffer = new byte[arrayLength]; //Stream zur Datei öffnen Filestream fs = new FileStream(fileName
nicht konstant const IList liste = new ArrayList(); // FEHLER: IList wird ein Struct zugewiesen
readBuffer.Length); //Stream schliesen fs.Close(); //Daten ggf. bearbeiten. ... // FEHLER: IList wird ein Referenzdatentyp zugewiesen
0
Java)
C++
In Java werden Konstanten durch das Schlüsselwort final gekennzeichnet
in Fortran durch PARAMETER. [Bearbeiten]
Eigenschaften (Schlüsselwörter
get
,
set
und
value
)
Eine Eigenschaft (property) ist eine Sicht auf eine öffentliche Variable einer Klasse
Die Variable selbst wird durch einen Zugriffsmodifizierer wie private oder protected (bei Variablen
die in abgeleiteten Klassen überschreiben werden sollen) für den Zugriff von außen gesperrt und über eine Eigenschaft zugänglich gemacht. Über die Eigenschaft kann dann bestimmt werden
ob ein lesender oder schreibender Zugriff auf die referenzierte Variable erfolgen darf
Beide Möglichkeiten sind auch miteinander kombinierbar
Eine Eigenschaft wird durch Zuweisung eines Datentyps (der dem Datentyp der Variable entsprechen muss) zu einem Eigenschaftsnamen angelegt und hat eine ähnliche Struktur wie die Syntax einer Methode
Die Eigenschaft ist dabei wie eine Variable ansprechbar und ihr kann auch ein Zugriffsmodifizierer zugewiesen werden
sondern bildet diese auf die referenzierte Variable ab (vergleichbar mit einem Zeiger)
Eine Eigenschaft enthält selbst keine Daten
Zur Abfrage einer Eigenschaft existiert in C# das Schlüsselwort get und zum Setzen eines Wertes das Schlüsselwort set
Von außen stellt sich die Eigenschaft dann wie eine Variable dar und der Zugriff kann entsprechend erfolgen (vgl
VisualBasic)
Die Programmiersprache Java verfolgt mit den Set- und Get-Methoden (Bean-Pattern
sondern über die entsprechende Methode
Introspection) das gleiche Ziel - alle Zugriffe erfolgen nie direkt über eine Variable
Beispiel einer Eigenschaftsdefinition Wohnort für eine private Variable (_wohnort): public class EigenschaftBeispiel { private string _wohnort; public string Wohnort { get { return _wohnort; } set { _wohnort = "12345 " + value; } } } Durch das "Weglassen" des Schlüsselwortes set oder des Schlüsselwortes get kann gesteuert werden
ob die Eigenschaft nur gelesen oder nur geschrieben werden darf
der gesetzt werden soll
Das Schlüsselwort value ist dabei ein Platzhalter für den der Eigenschaften zugewiesenen Wert
Er kann nur in Verbindung mit dem Schlüsselwort set im entsprechenden Block verwendet werden (und entspricht in etwa einer temporären lokalen Variable)
so würde der lesende Zugriff zu einem Zugriffsfehler führen (im Beispiel in der Zeile
Beispiel für den Zugriff auf die oben definierte Eigenschaft Wohnort: EigenschaftBeispiel instanz = new EigenschaftBeispiel(); instanz.Wohnort = "Musterstadt"; Console.WriteLine(instanz.Wohnort); // Ausgabe: 12345 Musterstadt Würde bei der obigen Definition der Eigenschaft 'Wohnort' der get-Block weggelassen
in der die Ausgabe erfolgt)
bevor er der Variablen zugewiesen wird
können im set-Block bzw. get-Block auch Operationen ausgeführt werden
beispielsweise die Potenzierung eines bei set übergebenen Wertes (value mal Exponent)
Neben dem einfachen Setzen oder Lesen einer Eigenschaft
Das gleiche gilt für das Schlüsselwort get
Theoretisch kann somit ein Zugriff für den Benutzer einer Klasse ganz unerwartete Ergebnisse bringen
Deshalb sollten alle Operationen
die Veränderungen auf einen Wert durchführen über normale Methoden abgebildet werden
Ausgenommen sind natürlich Wertprüfungen bei set
Das Beispiel konkateniert den der Eigenschaft übergebenen Wert (hier: Musterstadt) zur Zeichenkette "12345 "
sie sollte dennoch in einer Methode ausgeführt werden. [Bearbeiten]
Diese Aktion ist syntaktisch und semantisch richtig
Darstellung spezieller Zeichen oder Zeichenfolgen
vertikal 0x000B x Hexadezimale Zeichenfolge für ein einzelnes Unicode-Zeichen u Zeichenfolge für Unicode-Zeichen in Zeichenliteralen. U Zeichenfolge für Unicode-Zeichen in Zeichenketten-Literalen. Ein auf das Zeichen "" (umgekehrter Schrägstrich