www.wikidata.de-de.nina.az
Dieser Artikel oder Abschnitt bedarf einer grundsatzlichen Uberarbeitung Naheres sollte auf der Diskussionsseite angegeben sein Bitte hilf mit ihn zu verbessern und entferne anschliessend diese Markierung Dieser Artikel bietet eine Ubersicht einiger Sprachelemente von C Inhaltsverzeichnis 1 Bedingte Ausfuhrung if else switch 2 Schleifen for do while foreach 3 Die Sprunganweisungen break continue goto return yield return break 4 Die using Anweisung 5 Objekte und Klassen 6 Die Klasse namens object 7 Strukturen struct 8 Aufzahlungen Enumerationen 8 1 Flags 9 Zugriffsmodifikatoren 10 Datentypen Operatoren Eigenschaften und Konstanten 10 1 Datentypen und Speicherbedarf 10 2 Konstanten Schlusselwort const 10 3 Operatoren 10 3 1 Operatoren uberladen 10 4 Eigenschaften Schlusselworter get set und value 10 5 Indexer 10 6 Darstellung spezieller Zeichen oder Zeichenfolgen escapen 11 Vererbung 11 1 Schnittstellen 11 1 1 Vererbung von Schnittstellen 11 2 Das Schlusselwort base 11 3 Versiegelte Klassen 11 4 Statische Klassen 11 5 Erweiterungsmethoden 12 Methoden 12 1 Anonyme Methoden 12 2 Lambdaausdrucke 13 LINQ 14 Typumwandlungen 14 1 Benutzerdefinierte Typumwandlungen 15 Parametrische Polymorphie Generics 15 1 Definitionsseitige Ko und Kontravarianz 16 Assemblies 17 Attribute Metadaten 18 Ausnahmen Exceptions 18 1 Throw 19 Unsicherer Code 20 Kommentare und Dokumentation 21 Schlusselworter 21 1 Reservierte Schlusselworter 21 2 Kontextschlusselworter 22 Siehe auch 23 Literatur 24 EinzelnachweiseBedingte Ausfuhrung if else switch BearbeitenDer sogenannte if Block hat zur Folge dass die zwischen den geschweiften Klammern liegenden Anweisungen nur dann in Kraft treten wenn die angegebene Bedingung erfullt ist d h ihr Wert true ist Der else Block der nur in Verbindung mit einem if Block stehen kann wird nur dann ausgefuhrt wenn die Anweisungen des if Blocks nicht ausgefuhrt wurden if Bedingung Anweisungen else if Bedingung Anweisungen else Anweisungen Die switch Anweisung ist die Darstellung eines Falles in dem je nach Wert eines Ausdrucks andere Anweisungen ausgefuhrt werden mussen Es wird immer bei dem case Label fortgefahren dessen Wert mit dem Ausdruck in der switch Anweisung ubereinstimmt Wenn keiner der Falle zutrifft wird zum optionalen default Zweig gesprungen switch Ausdruck case Fall 1 Anweisungen break case Fall 2 Anweisungen break default Anweisungen break Im Gegensatz zu C und C hat die C switch Anweisung keine fall through Semantik Nicht leere Zweige mussen mit einem break continue goto throw oder return enden leere Zweige konnen jedoch von weiteren case Zweigen fortgesetzt werden um mehrere Falle mit einem Satz von Anweisungen zu behandeln switch Ausdruck case Fall 1 case Fall 2 Anweisungen break In C sind auch Strings als Prufausdruck erlaubt string cmd switch cmd case run Anweisungen break case save Anweisungen break default Anweisungen break Schleifen for do while foreach BearbeitenWird eine for Schleife ausgefuhrt wird zuerst der Startausdruck gultig Ist dieser vollstandig bearbeitet werden die Anweisungen im Schleifenrumpf und anschliessend der Inkrementierungsausdruck solange wiederholt abgearbeitet bis die Gultigkeitsbedingung false ergibt d h ungultig wird for Startausdruck Gultigkeitsbedingung Inkrementierungsausdruck Anweisungen Die while Schleife ist dagegen recht primitiv sie wiederholt die Anweisungen solange die Bedingung true zuruckgibt Die Bedingung der while Schleife wird immer vor dem Anweisungsblock ausgewertet Wenn die Bedingung von Anfang an nicht erfullt ist wird der Schleifenrumpf nicht durchlaufen while Bedingung Anweisungen Die Bedingung der Do While Schleife wird immer nach dem Anweisungsblock ausgefuhrt Die Schleife wird daher mindestens ein Mal durchlaufen do Anweisungen while Bedingung Mit der foreach Schleife wird durch alle Mitglieder einer Sequenz iteriert In der Schleife besteht nur lesender Zugriff auf die Schleifenvariable foreach Typ Variablename in Sequenz Anweisungen Die Sprunganweisungen break continue goto return yield return break Bearbeitenfor int i 0 i lt 10 i if i lt 8 continue Console WriteLine Continue wurde nicht ausgefuhrt Die Anweisung continue veranlasst den nachsten Durchlauf einer Schleife Dabei wird der restliche Code im Schleifenkorper nicht abgearbeitet Im Beispiel wird der Text nur zweimal ausgegeben for int i 0 i lt 100 i if i 5 break Console WriteLine i Die Anweisung break veranlasst das Programm die nachste umschliessende Schleife oder das umschliessende switch zu verlassen In diesem Beispiel werden nur die Zahlen 0 1 2 3 und 4 ausgegeben int a 1 Top a if a lt 5 goto Top Console WriteLine a sollte jetzt 6 sein Mit goto springt das Programm an das angegebene Sprungziel Die Benutzung von goto sollte jedoch moglichst vermieden werden da dadurch der Quellcode in der Regel unleserlicher wird Es gilt jedoch als akzeptiertes Sprachmittel um tief verschachtelte Schleifen zu verlassen da in diesen Fallen der Code mit goto lesbarer ist als durch mehrfache Verwendung von break oder anderen Sprachmitteln Siehe auch Spaghetticode Innerhalb einer switch Anweisung kann mittels goto case bzw goto default zu einem der Falle gesprungen werden 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 Wertetyp als Ruckgabewert zuruckgeliefert Methoden ohne Ruckgabewert werden mit dem Schlusselwort void gekennzeichnet Eine Besonderheit bildet der Ausdruck yield return Zweck ist es in verkurzter Schreibweise eine Ruckgabesequenz fur eine Methode oder eine Eigenschaft zu erzeugen Der Compiler nutzt hierzu einen eigenen Typ der von System Collections Generic IEnumerable lt T gt abgeleitet ist und somit mit einem foreach Block durchlaufen werden kann Jeder Aufruf von yield return fugt bis zum Verlassen der Methode Eigenschaft ein neues Element der Sequenz hinzu Wird das Konstrukt nicht einmal aufgerufen ist die Sequenz leer private int zahlen new int 5980 23980 public IEnumerable lt int gt ZahlenMinusEins get foreach int zahl in this zahlen yield return zahl 1 public IEnumerable lt double gt ToDouble IEnumerable lt int gt intZahlen foreach int zahl in intZahlen yield return double zahl Hierdurch muss keine temporare Liste erzeugt werden die die umgewandelten Zahlen erst zwischenspeichert und dann zuruckgibt private int zahlen new int 5980 23980 bspw aus einer Eigenschaft heraus public IEnumerable lt int gt ZahlenMinusEins get List lt int gt ruckgabe new List lt int gt foreach int zahl in this zahlen ruckgabe Add zahl 1 return ruckgabe Jedes Element das zuruckgegeben wird muss implizit in den Typ der Ruckgabesequenzelemente konvertierbar sein Zum Abbrechen des Vorgangs kann die Anweisung yield break verwendet werden bspw aus einer Methode heraus public IEnumerable lt double gt ToDouble IEnumerable lt int gt intZahlen int i 0 foreach int zahl in intZahlen if i 3 nach 3 Durchlaufen beenden yield break yield return double zahl Die Anweisungen return und yield return konnen nicht gemeinsam verwendet werden Bei der Verwendung muss beachtet werden dass die zuruckgegebene Sequenz die ihr zugrundeliegende Logik verzogert ausfuhrt was bedeutet dass der erste Durchlauf ein und derselben Sequenz andere Werte liefern kann als beim zweiten Mal interner Zahler private int i 0 public IEnumerable lt DateTime gt GetNow aktuelle Uhrzeit einziges Element yield return DateTime Now public IEnumerable lt int gt GetZahl internen Zahler um 1 erhohen einziges Element yield return this i public void TestZahl IEnumerable lt int gt sequenz this GetZahl foreach int zahl in sequenz Console WriteLine zahl 0 foreach int zahl in sequenz Console WriteLine zahl 1 foreach int zahl in sequenz Console WriteLine zahl 2 public void TestZeit IEnumerable lt DateTime gt sequenz this GetNow 1 einziges Element mit der aktuellen Uhrzeit foreach DateTime now in sequenz Console WriteLine now 2 Sekunden warten Thread Sleep 2000 2 einziges Element wie der Wert aus 1 ca 2 Sekunden foreach DateTime now in sequenz Console WriteLine now Die using Anweisung BearbeitenDie using Anweisung definiert einen Geltungsbereich an dessen Ende der Speicher von nicht mehr benotigten Objekten automatisch freigegeben wird Bei begrenzten Ressourcen wie Dateihandler stellt die using Anweisung sicher dass diese immer ausnahmesicher bereinigt werden using Font myFont new Font Arial 10 0f g DrawString Hallo Welt myFont Brushes Black Hier wird ein Font Objekt erzeugt das am Ende des Blocks automatisch durch Aufruf seiner Dispose Methode wieder freigegeben wird Dies geschieht selbst dann wenn in dem Block eine Ausnahme ausgelost wird Der Vorteil liegt in der vereinfachten Schreibweise denn intern wird daraus folgendes Konstrukt das ansonsten manuell so formuliert werden musste Font myFont new Font Arial 10 0f try g DrawString Hallo Welt myFont Brushes Black finally if myFont null myFont Dispose Klassen mussen die System IDisposable Schnittstelle implementieren damit die using Anweisung auf diese Weise eingesetzt werden kann Objekte und Klassen BearbeitenWenn man von einem Objekt spricht handelt es sich dabei in der Umgangssprache normalerweise um ein reales Objekt oder einen Gegenstand des taglichen Lebens Beispielsweise kann das ein Tier ein Fahrzeug ein Konto oder Ahnliches sein Jedes Objekt kann durch verschiedene Attribute beschrieben werden und verschiedene Zustande annehmen und diese auch auslosen Ubertragen auf die objektorientierte Programmierung und C ist ein Objekt ein Exemplar siehe Schlusselwort new einer Klasse Eine Klasse kann man dabei als Bauplan oder Gerust eines Objektes ansehen Eine Klasse besitzt Eigenschaften Variablen Methoden die Tatigkeiten darstellen und Ereignisse die die Folge von Zustanden sind bzw diese auslosen KlasseEigenschaft en Methode n Ereignis se Beispiel fur den Bauplan eines Autos class Auto Konstruktor dient zur Erzeugung public Auto string name System Drawing Color farbe this GeschwindigkeitKMH 0 this Name name this Farbe farbe Eigenschaften public double GeschwindigkeitKMH get private set public string Name get private set public System Drawing Color Farbe get private set private bool motorLaeuft false Methoden public void Beschleunigung double AenderungKMH this GeschwindigkeitKMH AenderungKMH GeschwindigkeitGeaendert this GeschwindigkeitKMH public void VollBremsung this GeschwindigkeitKMH 0d GeschwindigkeitGeaendert this GeschwindigkeitKMH public void MotorStarten if this motorLaeuft this motorLaeuft true MotorEreignis this motorLaeuft public void AutoStoppen if this GeschwindigkeitKMH 0d VollBremsung if this motorLaeuft this motorLaeuft false MotorEreignis this motorLaeuft public void Umlackieren System Drawing Color neueFarbe this Farbe neueFarbe Ereignisse public event MotorDelegat MotorEreignis public event GeschwindigkeitDelegat GeschwindigkeitGeaendert public delegate void MotorDelegat bool laeuft public delegate void GeschwindigkeitDelegat double geschwindigkeit Die Klasse namens object BearbeitenDie Klasse object ein Alias fur System Object ist ein Referenztyp von dem jede Klasse abgeleitet wird So kann durch implizite Typumwandlung jeder Objekttyp in object umgewandelt werden NET und damit auch C unterscheidet zwischen Werttypen und Referenztypen Werttypen sind jedoch auch uber den Zwischenschritt ValueType von object abgeleitet Deshalb kann mittels eines boxing unboxing genannten Verfahrens auch eine Variable vom Typ object auf einen Werttyp z B int verweisen Strukturen struct BearbeitenStrukturen sind bereits als Sprachmittel aus Sprachen wie C oder Delphi Records bekannt Sie dienen primar zur Erstellung eigener komplexer Datenstrukturen oder eigener Datentypen So kann zum Beispiel eine Raumkoordinate bestehend aus einer X einer Y und einer Z Position durch eine Datenstruktur Koordinate abgebildet werden die sich aus drei Gleitkommazahlen einfacher oder doppelter Genauigkeit zusammensetzt public struct Koordinate public double X get public double Y get public double Z get public Koordinate double x double y double z X x Y y Z z public override string ToString return x X y Y z Z C fasst eine uber das Schlusselwort struct definierte Struktur als einen Wertetyp auf Strukturen in C konnen ausserdem Methoden Eigenschaften Konstruktoren und andere Elemente von Klassen aufweisen sie konnen aber nicht beerbt werden Der Unterschied einer Strukturinstanz im Vergleich zu einem Objekt besteht in ihrer Reprasentation im Speicher Da keine zusatzlichen Speicherreferenzen benotigt werden wie es bei einem Objekt erforderlich ist Referenztyp konnen Strukturinstanzen wesentlich ressourcenschonender eingesetzt werden So basieren beispielsweise alle primitiven Datentypen in C auf Strukturen Aufzahlungen Enumerationen BearbeitenAufzahlungen dienen zur automatischen Nummerierung der in der Aufzahlung enthaltenen Elemente Die Syntax fur die Definition von Aufzahlungen verwendet das Schlusselwort enum Abkurzung fur Enumeration Der in C verwendete Aufzahlungstyp ahnelt dem in C mit der Ausnahme dass ein optionaler ganzzahliger Datentyp fur die Nummerierung der Elemente angegeben werden kann Ohne Angabe eines Datentyps wird int verwendet public enum Wochentag Montag 1 Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag Die Elementnummerierung in C beginnt bei 0 Es ist aber auch moglich wie in C jedem Element oder nur dem ersten Element einen eigenen Startwert zuzuweisen wie im obigen Beispiel Dabei konnen sich die Anfangswerte wiederholen Die Zahlung beginnt dann jeweils von neuem bei dem definierten Startwert und Element In C ist es auch moglich ein bestimmtes Element einer Enumeration uber seine Ordinalzahl anzusprechen Hierzu ist aber eine explizite Typumwandlung notwendig Wochentag Tag Wochentag Mittwoch System Console WriteLine Tag Ausgabe Mittwoch System Console WriteLine int Tag Ausgabe 3 System Console WriteLine Wochentag 3 Ausgabe Mittwoch Flags Bearbeiten Neben der beschriebenen Variante des enum Aufzahlungstyps 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 konnen auf Bitebene verknupft werden sodass mehrere Elemente zu einem neuen kombiniert werden konnen Hierzu mussen den zu kombinierenden Elementen Zweierpotenzen als Werte zugewiesen werden damit eine Kombination ermoglicht wird Flags public enum AccessMode None 0 Read 1 Write 2 Erhalt den Wert 3 Kombination aus 1 und 2 ReadAndWrite Read Write Zugriffsmodifikatoren BearbeitenZugriffsmodifikatoren regeln den Zugriff auf Klassen und deren Mitglieder Methoden Eigenschaften Variablen Felder und Ereignisse in C Die folgende Tabelle fuhrt die von C unterstutzten Zugriffsmodifikatoren auf und beschreibt deren Wirkung und den Sichtbarkeitskontext Name Wirkungabstract Abstrakte Member sind zwar deklariert aber nicht implementiert Die Implementierung erfolgt zwingend in der abgeleiteten Klasse Von einer abstrakten Klasse kann keine Instanz erzeugt werden internal internal beschrankt den Zugriff auf Klassen und deren Mitglieder auf eine Assembly Es handelt sich hierbei nicht um eine Beschrankung auf Namespaces sondern auf die Assembly also auf die jeweilige ausfuhrbare Datei oder die Klassenbibliothek Unter Java entspricht das der Beschrankung auf ein package new Hier ist nicht der Aufruf des Konstruktors gemeint Mit dem new Modifizierer wird ein Member der Basisklasse verdeckt Der Klassen Member besitzt dieselbe Signatur aber eine andere Funktionalitat und steht mit dem verdeckten Member der Basisklasse nicht in Beziehung Beim Aufruf sind alle Basisklassenmember mit demselben Namen ausgeblendet Ohne diesen Modifizierer gibt der Compiler eine Warnung aus override Der Modifizierer override uberschreibt die abstrakte oder virtuelle Implementierung einer Methode oder Eigenschaft bzw eines Indexers oder Ereignisses der Basisklasse override Member sind automatisch virtual In der Vererbungshierarchie handelt es sich um eine weitere Implementierung private Beschrankt den Zugriff auf eine Klasse und deren Mitglieder Eine mit private deklarierte Klasse kann nur innerhalb der Klasse selbst instanziert werden beispielsweise kann ein offentlicher Konstruktor einer Klasse oder die statische Funktion Main einen privaten Konstruktor aufrufen der nicht von aussen aufgerufen werden kann Oft wird private verwendet um das Singleton Muster umzusetzen z B bei der Verwendung einer Klasse als Fabrik siehe Fabrikmethode oder die Vererbung zu beeinflussen oder zu verbieten siehe auch Schlusselwort sealed Hinweis Eine abgeleitete Klasse kann auf private Mitglieder der Basisklasse vgl Schlusselwort base ebenfalls nicht zugreifen Soll ein solcher Zugriff moglich sein so muss der Zugriffsmodifikator protected verwendet werden protected Der Modifikator protected erlaubt den Zugriff nur in der eigenen Vererbungshierarchie also nur fur die deklarierende Klasse und alle abgeleiteten Klassen protected internal Der Modifikator protected internal ist eine Kombination aus den Modifikatoren protected und internal Die Methode ist sichtbar fur die deklarierende und fur alle abgeleiteten Klassen sowie fur alle Klassen innerhalb der Assembly Eine Sichtbarkeit nur fur abgeleitete Klassen innerhalb der Assembly existiert in C nicht In diesem Fall muss auf den Modifikator internal zuruckgegriffen werden public Auf als public gekennzeichnete Klassen oder Klassenmitglieder z B Methoden oder Eigenschaften kann unbeschrankt zugegriffen werden Sie werden deshalb auch als offentlich bezeichnet sealed sealed kann auf Klassen Instanzmethoden und Eigenschaften angewendet werden Von versiegelten Klassen kann nicht abgeleitet werden Eine versiegelte Methode uberschreibt eine virtuelle Methode der Basisklasse Die versiegelte Methode bleibt fur erbende Klassen sichtbar eine weitere Uberschreibung durch sie ist jedoch nicht mehr moglich Dies ist somit die letzte Implementierung in der Vererbungshierarchie static static Member sind klassenspezifisch aber nicht instanzspezifisch Von statischen Klassen kann keine Instanz erzeugt werden Statische Member einer Klasse werden mit dem Namen der Klasse nicht mit dem Namen der Objektinstanz aufgerufen Beispiel Math Sqrt Fur jede Instanz einer Klasse wird eine separate Kopie aller Instanzenfelder erzeugt bei statischen Feldern ist lediglich eine Kopie vorhanden virtual Der virtual Modifizierer gibt an dass es sich um die erste Implementierung in der Vererbungshierarchie handelt Virtuelle Member konnen in einer abgeleiteten Klasse mit dem Modifikator override uberschrieben werden Fehlt virtual bei einem Member handelt es sich um die einzige Implementierung Hinweise Per Voreinstellung sind Klassenmitglieder Methoden Eigenschaften usw denen kein Zugriffsmodifikator zugewiesen wurde automatisch als private deklariert Klassen selbst dagegen besitzen automatisch den Modifikator internal und sind nur in der aktuellen Assembly sichtbar Die Modifikatoren konnen 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 ubernommen Zur Implementierung eines Schnittstellenmembers muss ein Klassenmember entweder als public deklariert werden oder der Schnittstellenmember muss explizit implementiert werden Datentypen Operatoren Eigenschaften und Konstanten BearbeitenC kennt zwei Arten von Datentypen Wertetypen und Referenztypen Referenztypen durfen dabei nicht mit Zeigern gleichgesetzt werden wie sie u a aus der Sprache C bekannt sind Diese werden von C auch unterstutzt aber nur im unsicheren Modus engl unsafe mode Wertetypen enthalten die Daten direkt wobei Referenztypen im Gegensatz dazu nur Verweise auf die eigentlichen Daten oder besser Objekte darstellen Beim Lesen und Schreiben von Wertetypen werden die Daten dagegen uber einen Automatismus Autoboxing genannt in einer Instanz der jeweiligen Hullenklasse engl wrapper gespeichert oder aus ihr geladen Die Zuweisung eines Wertes bzw einer Referenz kann wahrend der Deklaration erfolgen oder spater sofern nicht eine Konstante deklariert wurde Die Deklaration erfolgt durch Angabe eines Datentyps gefolgt von einem Variablennamen Datentyp Variable int i System Collections IList liste Es konnen auch mehrere Variablen des gleichen Typs zeitgleich deklariert werden Datentyp Variable1 Variable2 int i j k System Collections IList liste1 liste2 Ferner besteht die Moglichkeit 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 3 System Collections IList liste new System Collections ArrayList Auch die Mehrfachzuweisung eines Wertes an verschiedene Variablen ist moglich int i j k i j k 123 Einen Sonderfall der Zuweisung stellt die Deklaration von Feldern Arrays dar Naheres hierzu im entsprechenden Abschnitt Datentypen und Speicherbedarf Bearbeiten Datentyp Bit Suffix Vorz Alias fur struct type bool 8 System Booleanbyte 8 N System Bytechar 16 System Chardecimal 128 m M System Decimaldouble 64 d D System Doublefloat 32 f F System Singleint 32 J System Int32long 64 l L J System Int64sbyte 8 J System SByteshort 16 J System Int16uint 32 u U N System UInt32ulong 64 ul UL N System UInt64ushort 16 N System UInt16Datentypen sind in C nicht elementar sondern objektbasiert Jeder der in der Tabelle aufgefuhrten Datentypen stellt einen Alias auf eine Klasse des Namensraumes System dar Beispielsweise wird der Datentyp bool durch die Klasse System Boolean abgebildet Durch die Objektbasiertheit ist es moglich Methoden auf Datentypen anzuwenden 1234 ToString int i 17 i ToString Vergleichbar mit C und anders als bei Java gibt es unter C vorzeichenbehaftete und vorzeichenlose Datentypen Diese werden durch Voranstellen des Buchstabens s fur signed englisch fur vorzeichenbehaftet und durch Voranstellen des Buchstabens u fur unsigned englisch fur vorzeichenlos gekennzeichnet sbyte uint ulong ushort mit Ausnahme von short Die Gleitkomma Datentypen float double decimal konnen neben einfacher auch doppelte Genauigkeit aufweisen und unterscheiden sich im Speicherbedarf Dadurch andert sich die Genauigkeit was in der Anzahl der moglichen Nachkommastellen zum Ausdruck kommt Konstanten Schlusselwort const Bearbeiten Einem mit const deklarierten Objekt kann nach der Deklaration und Initialisierung kein neuer Inhalt zugewiesen werden Das Objekt wird dadurch zu einer Konstanten Es muss dabei vom Compiler festgestellt werden konnen dass der Wert der einer Konstante zugewiesen wird unveranderlich ist Es ist also auch moglich eine Konstante von einem Referenztypen zu definieren allerdings darf dieser nur null zugewiesen werden Grund dafur ist dass der Compiler alle Verwendungen von Konstanten bereits zum Zeitpunkt des Kompilierens ersetzt Strukturen konnen nicht konstant sein da sie in einem Konstruktor einen Zufallsgenerator benutzen konnten Fehlerhafte Zuweisungen einer Konstanten werden mit dem Kompilierfehler CS0133 vom C Sharp Kompilierer moniert using System using System IO public class ConstBeispiel public static void Main Es wird eine Konstante fur die Lange eines Arrays angelegt const int arrayLength 1024 Es wird eine Konstante festgelegt welche die Zugriffsart auf eine Datei beschreibt Enum const FileMode fm FileMode Open Es wird eine Konstante festgelegt welche den Namen der zu offnenden Datei festlegt const string fileName beispiel txt Buffer erstellen byte readBuffer new byte arrayLength Stream zur Datei offnen FileStream fs new FileStream fileName fm Daten Lesen fs Read readBuffer 0 readBuffer Length Stream schliessen fs Close Daten ggf bearbeiten FEHLER IList wird ein Referenzdatentyp zugewiesen nicht konstant const IList liste new ArrayList FEHLER const struct const TimeSpan zeitSpanne new TimeSpan 10 Konstanten gibt es auch in anderen Sprachen z B C Java In Java werden Konstanten durch das Schlusselwort final gekennzeichnet in Fortran durch PARAMETER Operatoren Bearbeiten Operatoren fuhren verschiedene Operationen an Werten durch und erzeugen dabei einen neuen Wert Je nach Anzahl der Operanden wird zwischen unaren binaren und ternaren Operatoren unterschieden Die Reihenfolge der Auswertung wird durch die Prioritat und Assoziativitat bestimmt und kann durch Klammerausdrucken geandert werden Operatorrangfolge Operator Beschreibung1 Primare Operatoren x y Memberzugrifff x Aufrufen von Methoden und Delegatena x Array und Indexerzugriffx Postinkrementx Postdekrementnew T Objekt und Delegaterstellungnew T Objekterstellung mit Initialisierernnew Anonymer Objektinitialisierernew T Arrayerstellungtypeof T Abrufen des System Type Objekts fur Tchecked x Auswerten von Ausdrucken in uberpruftem Kontextunchecked x Auswerten von Ausdrucken in nicht uberpruftem Kontextdefault T Abrufen des Standardwerts vom Typ Tdelegate Anonyme Methode2 Unare Operatoren x Identitat x Negation x Logische Negation x Bitweise Negation x Prainkrement x Pradekrement T x Explizites Konvertieren von x in den Typ T3 Multiplikative Operatoren Multiplikation Division Modulo4 Additive Operatoren x y Addition Zeichenfolgenverkettung Delegatkombinationx y Subtraktion Delegatentfernung5 Schiebeoperatoren x lt lt y Linksverschiebungx gt gt y Rechtsverschiebung6 Relationale Operatoren und Typoperatoren x lt y Kleiner alsx gt y Grosser alsx lt y Kleiner oder gleichx gt y Grosser oder gleichx is T Gibt true zuruck wenn x vom Typ T ist andernfalls false x as T Gibt x als T typisiert zuruck oder NULL wenn x nicht vom Typ T ist 7 Gleichheitsoperatoren x y Gleichx y Ungleich8 Logische bedingte und NULL Operatoren x amp y Ganzzahliges bitweises AND boolesches logisches ANDx y Ganzzahliges bitweises XOR boolesches logisches XORx y Ganzzahliges bitweises OR boolesches logisches ORx amp amp y Wertet y nur aus wenn x den Wert true hat x y Wertet y nur aus wenn x den Wert false hat x y Ergibt y wenn x den Wert NULL hat andernfalls xx y z Wird zu y ausgewertet wenn x den Wert true hat und zu z wenn x den Wert false hat 9 Zuweisungsoperatoren und anonyme Operatoren Zuweisungx op y Verbundzuweisung Entspricht x x op y wobei op der Operator amp lt lt oder gt gt ist T x gt y Anonyme Methode Lambda Ausdruck Operatoren uberladen Bearbeiten C bietet die Moglichkeit Operatoren fur benutzerdefinierte Datentypen zu implementieren Als benutzerdefinierter Datentyp gilt eine selbst geschriebene Klasse oder Struktur Die Implementierung geschieht mit offentlichen statischen Methoden Statt eines Namens tragen sie das Schlusselwort operator gefolgt von dem Operator Zeichen welches uberladen werden soll Eine implizite oder explizite Typkonvertierung geschieht mittels implicit operator oder explicit operator als Methoden Namen Der Compiler ersetzt je nach Typ der Operanden den Quelltext in einen Aufruf der entsprechenden Methode struct SpecialDouble public SpecialDouble double argument value argument SpecialDouble lhs 9d rhs 0 5 result result lhs rhs Compiler ersetzt Operator mit dieser Methode public static SpecialDouble operator SpecialDouble lhs SpecialDouble rhs return Math Pow lhs value rhs value SpecialDouble lhs 9d 9d wird mit new SpecialDouble 9d ersetzt public static implicit operator SpecialDouble double argument return new SpecialDouble argument public static implicit operator double SpecialDouble argument return argument value explizite Typkonvertierung Nachkommastellen gehen verloren Exception kann auftreten public static explicit operator int SpecialDouble argument return int argument value double value Einschrankungen Mindestens ein Parameter der Methode fur die Uberladung muss den Typ besitzen fur den der Operator uberladen wird Vergleichsoperatoren konnen nur paarweise uberladen werden Es konnen keine neuen Symbole verwendet werden Nur die Operator Symbole sind erlaubt die in der Sprache definiert sind Siehe dazu Tabelle Operatoren Die Operatoren gt new is sizeof typeof und gt konnen nicht uberladen werden Die Prioritat eines benutzerdefinierten Operators kann nicht geandert werden Der Vorrang und die Orientierung basiert auf dem Symbol des Operators Die Anzahl der Operanden ist ebenfalls an das Symbol des Operators gebunden Operatoren die nicht reserviert sind konnen nicht implementiert werden Um den Operator zu simulieren konnen Indexer verwendet werden Die Operatoren amp amp und konnen nicht direkt uberladen werden Sie werden uber die speziellen uberladbaren Operatoren true und false ausgewertet Die Operation x amp amp y wird als T false x x T amp x y ausgewertet wobei T false x ein Aufruf von dem in T deklarierten Operator false ist und T amp x y ein Aufruf des ausgewahlten Operator amp 1 Die Operation x y wird als T true x x T x y ausgewertet wobei T true x ein Aufruf von dem in T deklarierten Operator true ist und T x y ein Aufruf des ausgewahlten Operator 1 Eigenschaften Schlusselworter get set und value Bearbeiten Eine Eigenschaft property ist eine Sicht auf eine offentliche Variable einer Klasse Die Variable selbst wird durch einen Zugriffsmodifikator wie private oder protected bei Variablen die in abgeleiteten Klassen uberschrieben werden sollen fur den Zugriff von aussen gesperrt und uber eine Eigenschaft zuganglich gemacht Uber die Eigenschaft kann dann bestimmt werden ob ein lesender oder schreibender Zugriff auf die referenzierte Variable erfolgen darf Beide Moglichkeiten 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 ahnliche Struktur wie die Syntax einer Methode Die Eigenschaft ist dabei wie eine Variable ansprechbar und ihr kann auch ein Zugriffsmodifikator zugewiesen werden Eine Eigenschaft enthalt selbst keine Daten sondern bildet diese auf die referenzierte Variable ab vergleichbar mit einem Zeiger Zur Abfrage einer Eigenschaft existiert in C das Schlusselwort get und zum Setzen eines Wertes das Schlusselwort set Von aussen 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 Introspection das gleiche Ziel alle Zugriffe erfolgen nie direkt uber eine Variable sondern uber die entsprechende Methode Beispiel einer Eigenschaftsdefinition Wohnort fur eine private Variable wohnort public class EigenschaftBeispiel private string wohnort public string Wohnort get return wohnort set wohnort 12345 value Durch das Weglassen des Schlusselwortes set oder des Schlusselwortes get kann gesteuert werden ob die Eigenschaft nur gelesen oder nur geschrieben werden darf Das Schlusselwort value ist dabei ein Platzhalter fur den der Eigenschaft zugewiesenen Wert der gesetzt werden soll Er kann nur in Verbindung mit dem Schlusselwort set im entsprechenden Block verwendet werden und entspricht in etwa einer temporaren lokalen Variable Beispiel fur den Zugriff auf die oben definierte Eigenschaft Wohnort EigenschaftBeispiel instanz new EigenschaftBeispiel instanz Wohnort Musterstadt Console WriteLine instanz Wohnort Ausgabe 12345 Musterstadt Wurde bei der obigen Definition der Eigenschaft Wohnort der get Block weggelassen so wurde der lesende Zugriff zu einem Zugriffsfehler fuhren im Beispiel in der Zeile in der die Ausgabe erfolgt Neben dem einfachen Setzen oder Lesen einer Eigenschaft konnen im set Block bzw get Block auch Operationen ausgefuhrt werden beispielsweise die Potenzierung eines bei set ubergebenen Wertes value mal Exponent bevor er der Variablen zugewiesen wird Das Gleiche gilt fur das Schlusselwort get Theoretisch kann somit ein Zugriff fur den Benutzer einer Klasse ganz unerwartete Ergebnisse bringen Deshalb sollten alle Operationen die Veranderungen auf einen Wert durchfuhren uber normale Methoden abgebildet werden Ausgenommen sind naturlich Wertprufungen bei set Das Beispiel konkateniert den der Eigenschaft ubergebenen Wert hier Musterstadt zur Zeichenkette 12345 Diese Aktion ist syntaktisch und semantisch richtig sie sollte dennoch in einer Methode ausgefuhrt werden Ab C 3 0 ist es moglich Eigenschaften automatisch zu implementieren Dies ist eine verkurzte Schreibweise fur Eigenschaften bei denen es sich um den Zugriff auf eine Variable handelt die innerhalb der Klasse bzw Struktur als Feld deklariert wurde Beispiel anhand der Struktur Point struct Point public double X get return this x set this x value public double Y get return this y set this y value private double x y Das gleiche Beispiel mit Hilfe automatisch implementierter Eigenschaften struct Point public double X get set public double Y get set Mit Hilfe des Objektinitialisierers ab NET 3 5 ist ein Konstruktor uberflussig Point p new Point X 1 2 Y 3 75 Objektinitialisierer Console WriteLine p X Ausgabe 1 2 Console WriteLine p Y Ausgabe 3 75 Indexer Bearbeiten Der Indexer ist die Standardeigenschaft von einem Objekt Der Aufruf geschieht wie bei einem Array mit eckigen Klammern Beispiel Zugriff auf die 32 Bits einer int Variable mit Hilfe eines Indexers using System namespace DemoIndexers class Program struct IntBits public bool this int index get return bits amp 1 lt lt index 0 set if value bits 1 lt lt index else bits amp 1 lt lt index private int bits static void Main string args IntBits bits new IntBits Console WriteLine bits 6 False bits 2 true Console WriteLine bits 2 True bits 2 false Console WriteLine bits 2 False Wie bei Eigenschaften kann der Zugriff auf nur lesend oder nur schreibend beschrankt werden indem man den get Accessor bzw set Accessor weglasst Unterschiede zu Arrays Methoden und Eigenschaften Indexer mussen mindestens ein Parameter besitzen Im Gegensatz zu Arrays konnen beim Zugriff auch nicht ganzzahlige Werte verwendet werden public double this string name ist erlaubt Indexer konnen uberladen werden Statische Indexer sind nicht erlaubt sowie void als Ruckgabewert ref und out durfen bei Indexern nicht verwendet werden Darstellung spezieller Zeichen oder Zeichenfolgen escapen Bearbeiten Seq Beschreibung Hexadezimal Einleitung alternativer Interpretation 0x001B Einfaches Anfuhrungszeichen 0x0007 Doppeltes Anfuhrungszeichen 0x0022 Umgekehrter Schragstrich 0x005C 0 Null 0x0000 a Signalton engl alert 0x0007 b Ruckschritt engl backspace 0x0008 f Seitenvorschub engl form feed 0x000C n Zeilenwechsel engl new line 0x000A r Wagenrucklauf engl carriage return 0x000D t Tabulatorzeichen horizontal 0x0009 v Tabulatorzeichen vertikal 0x000B x Hexadezimale Zeichenfolge fur ein einzelnes Unicode Zeichen u Zeichenfolge fur Unicode Zeichen in Zeichenliteralen U Zeichenfolge fur Unicode Zeichen in Zeichenketten Literalen Ein auf das Zeichen umgekehrter Schragstrich engl backslash folgendes Zeichen wird anders interpretiert als sonst Dabei handelt es sich meistens um nicht darstellbare Zeichen Soll der umgekehrte Schragstrich selbst dargestellt werden so muss er doppelt angegeben werden Hexadezimale Zeichenfolge als Platzhalter fur ein einzelnes Unicode Zeichen Das Zeichen wird dabei aus dem Steuerzeichen x gefolgt von dem hexadezimalen Wert des Zeichens gebildet Zeichenfolge fur Unicode Zeichen in Zeichenliteralen Das Zeichen wird dabei aus dem Steuerzeichen u gefolgt von dem hexadezimalen Wert des Zeichens gebildet z B u20ac fur Der Wert muss zwischen U 0000 und U FFFF liegen Zeichenfolge fur Unicode Zeichen in Zeichenkettenliteralen Das Zeichen wird dabei aus dem Steuerzeichen U gefolgt von dem hexadezimalen Wert des Zeichens gebildet Der Wert muss zwischen U 10000 und U 10FFFF liegen Hinweis Unicode Zeichen im Wertbereich zwischen U 10000 und U 10FFFF sind nur fur Zeichenfolgen Literale zulassig und werden als zwei Unicode Ersatzzeichen kodiert bzw interpretiert s a UTF 16 Vererbung BearbeitenSchnittstellen Bearbeiten Mehrfachvererbung wird in C nur in Form von Schnittstellen engl interfaces unterstutzt Schnittstellen dienen in C zur Definition von Methoden ihrer Parameter ihrer Ruckgabewerte sowie von moglichen Ausnahmen An dieser Stelle ein Anwendungsbeispiel fur die Mehrfachvererbung public class MyInt IComparable IDisposable Implementierung Schnittstellen in C ahneln den Schnittstellen der Programmiersprache Java Anders als in Java durfen Schnittstellen in C keine Konstanten enthalten und auch keine Zugriffsmodifikator bei der Definition einer Methode vereinbaren public interface A void MethodeA public interface B void MethodeA void MethodeB public class Klasse A B void A MethodeA Console WriteLine A A MethodeA aus Schnittstelle A void B MethodeA Console WriteLine A B MethodeA aus Schnittstelle B public void MethodeA Console WriteLine A C MethodeA fur Klasse public void MethodeB Console WriteLine B B MethodeB aus Schnittstelle B Eine Klasse die ein oder mehrere Schnittstellen einbindet muss jede in der Schnittstelle definierte virtuelle Methode implementieren Werden mehrere Schnittstellen eingebunden die Methoden mit dem gleichen Namen und der gleichen Struktur besitzen d h gleiche Parametertypen Ruckgabewerte usw so muss die jeweilige Methode in der implementierenden Klasse durch das Voranstellen des Namens der Schnittstelle gekennzeichnet werden Dabei wird die jeweilige Funktion nur dann aufgerufen wenn der Zeiger auf das Objekt vom entsprechenden Typ ist public static void Main Klasse k new Klasse k as A MethodeA k as B MethodeA k MethodeA Console ReadLine AusgabeA A A B A C Auch Schnittstellen ohne Methodendefinition sind moglich Sie dienen dann als sogenannte Markierungsschnittstellen engl marker interface Auf die Verwendung von marker interfaces sollte zu Gunsten von Attributen verzichtet werden Schnittstellen konnen jedoch keine statischen Methoden definieren Das Einbinden einer Schnittstelle erfolgt analog zur Beerbung einer Klasse Schnittstellen werden per Konvention mit einem fuhrenden I fur Interface benannt Vererbung von Schnittstellen Bearbeiten Auswirkung der Zugriffsmodifikatoren bei Vererbung mit Interface kein Modifikator newCode interface IMessage string Message get public class MyClass IMessage public string Message get return MyClass public class MyDerivedClass MyClass public string Message get return MyDerivedClass interface IMessage string Message get public class MyClass IMessage public string Message get return MyClass public class MyDerivedClass MyClass public new string Message get return MyDerivedClass Test Verwendung MyDerivedClass mdc new MyDerivedClass MyClass mc mdc as MyClass IMessage m mdc as IMessage Assert AreEqual mdc Message MyDerivedClass Assert AreEqual mc Message MyClass Assert AreEqual m Message MyClass MyDerivedClass mdc new MyDerivedClass MyClass mc mdc as MyClass IMessage m mdc as IMessage Assert AreEqual mdc Message MyDerivedClass Assert AreEqual mc Message MyClass Assert AreEqual m Message MyDerivedClass virtual amp override abstract amp overrideCode interface IMessage string Message get public class MyClass IMessage public virtual string Message get return MyClass public class MyDerivedClass MyClass public override string Message get return MyDerivedClass interface IMessage string Message get public class MyClass IMessage public abstract string Message get public class MyDerivedClass MyClass public override string Message get return MyDerivedClass Test Verwendung MyDerivedClass mdc new MyDerivedClass MyClass mc mdc as MyClass IMessage m mdc as IMessage Assert AreEqual mdc Message MyDerivedClass Assert AreEqual mc Message MyDerivedClass Assert AreEqual m Message MyDerivedClass MyDerivedClass mdc new MyDerivedClass MyClass mc mdc as MyClass IMessage m mdc as IMessage Assert AreEqual mdc Message MyDerivedClass Assert AreEqual mc Message MyDerivedClass Assert AreEqual m Message MyDerivedClass Das Uberschreiben einer Methode durch eine abgeleitete Klasse kann mit sealed verhindert werden interface IMessage string Message get public class MyClass IMessage public virtual void OnMessage kann von abgeleiteter Klasse implementiert werden kann nicht uberschrieben werden public sealed string Message get OnMessage return MyClass Ein Interface kann auch durch eine Basisklasse implementiert werden interface IMessage string Message get public class Messenger public string Message get return Messenger public class MyClass Messenger IMessage interface bereits implementiert Das Schlusselwort base Bearbeiten Das Schlusselwort wird im Zusammenhang von Vererbung genutzt Vereinfacht gesagt ist die Basisklasse das was this fur die aktuelle Klasse ist Java hingegen sieht hierfur das Schlusselwort super vor Nun folgt ein Beispiel das die Verwendung von base zeigt public class Example Basisklasse private int myMember public Example base 3 myMember 2 In diesem Beispiel wurde die Verwendung nur anhand des Basisklassenkonstruktors gezeigt Wie in der Einleitung beschrieben kann base auch fur den Zugriff auf die Mitglieder der Basisklasse benutzt werden Die Verwendung erfolgt aquivalent zur Verwendung von this bei der aktuellen Klasse Versiegelte Klassen Bearbeiten Versiegelte Klassen sind Klassen von denen keine Ableitung moglich ist und die folglich nicht als Basisklassen benutzt werden konnen Bekanntester Vertreter dieser Art von Klassen ist die Klasse String aus dem Namensraum System Der Modifizierer sealed kennzeichnet Klassen als versiegelt Es ist jedoch moglich versiegelte Klassen mit Erweiterungsmethoden zu erweitern Statische Klassen Bearbeiten Analog zu Visual Basic NET Modulen konnen in C Klassen definiert werden die ausschliesslich aus statischen Elementen bestehen static class MeineStatischeKlasse public static int StatischeEigenschaft get return 5979 public static void StatischeMethode Dies wurde der Compiler als Fehler ansehen da diese Methode nicht statisch ist public void NichtStatischeMethode Erweiterungsmethoden Bearbeiten Hauptartikel Erweiterungsmethode Ab der Version 3 0 konnen Datentypen erweitert werden Hierzu wird eine statische Klasse definiert Erweiterungsmethoden engl extensions beinhalten jeweils einen ersten Parameter der mit dem Schlusselwort this beginnt gefolgt von der gewohnlichen Definition des Parameters using System namespace MeinNamespace public static class ExtensionKlasse public static int MalDrei this int zahl return zahl 3 public static class Programm public static void Main 5979 Console WriteLine 1993 MalDrei Sofern die Klasse ExtensionKlasse fur eine andere Klasse sichtbar ist werden nun alle Zahlen vom Typ int mit der Methode MalDrei erweitert ohne aber den Typ int wirklich zu andern Der Compiler macht hierbei intern nichts anderes als die Methode MalDrei der Klasse ExtensionKlasse aufzurufen und den Wert 1993 als ersten Parameter zu ubergeben Methoden BearbeitenAnonyme Methoden Bearbeiten Anonyme Methoden werden u a verwendet um Code fur ein Event zu hinterlegen ohne in einer Klasse eine Methode mit einem eindeutigen Namen definieren zu mussen Anstelle des Methodennamens steht das Schlusselwort delegate Button btn new Button Name MeinButton Text Klick mich btn Click delegate object sender EventArgs e Button button Button sender MessageBox Show Der Button button Name wurde angeklickt Lambdaausdrucke Bearbeiten Ab der Version 3 0 besteht die Moglichkeit anonyme Methoden in kurzerer Form zu definieren Dies geschieht mit dem Operator Lambda gt ausgesprochen wechselt zu Auf der linken Seite des Lambda Operators werden die Eingabeparameter angegeben auf der rechten Seite befindet sich der Anweisungsblock bzw ein Ausdruck Handelt es sich um einen Anweisungsblock spricht man von einem Anweisungslambda Ein Ausdruckslambda wie zum Beispiel x gt x x ist hingegen ein Delegate dessen einzige Anweisung ein return ist Der Typ der Eingabeparameter kann weggelassen werden wenn der Compiler diese ableiten kann Lambda Ausdrucke konnen sich auf aussere Variablen beziehen die im Bereich der einschliessenden Methode oder des Typs liegen in dem der Lambda Ausdruck definiert wurde Button btn new Button Name MeinButton Text Klick mich sender wird implizit als System Object betrachtet e wird implizit als System EventArgs betrachtet btn Click sender e gt Button button Button sender MessageBox Show Der Button button Name wurde angeklickt LINQ Bearbeiten Hauptartikel LINQ LINQ definiert drei Dinge Eine Syntax fur Abfrage Ausdrucke die sich stark an SQL orientiert Ubersetzungsregeln Namen kaum mehr fur Methoden die in Ubersetzungsergebnissen benutzt werden Implementiert wird die Funktionalitat durch sogenannte LINQ Provider die die namentlich definierten Methoden zur Verfugung stellen Einer davon ist zum Beispiel LINQ to Objects nimm die Liste der Mitarbeiter und schreibe jedes Element nach m var liste from m in this MitarbeiterListe lies das Property Nachname und nimm nur die Elemente die gleich Mustermann sind where m Nachname Mustermann sortiere zuerst ABsteigend nach dem Property Vorname dann AUFsteigend nach dem Property MitarbeiterNummer orderby m Vorname descending m MitarbeiterNummer wahle nun zum Schluss als Element fur die Liste namens liste den Wert aus dem Property Vorname jedes Elements aus select m Vorname In MySQL konnte der obere Ausdruck bspw folgendermassen aussehen SELECT m Vorname FROM MitarbeiterListe AS m WHERE m Nachname Mustermann ORDER BY m Vorname DESC m MitarbeiterNummer ASCTypumwandlungen BearbeitenIn C ist jeder Variablen ein Datentyp zugeordnet Manchmal ist es notig Typen von Variablen ineinander umzuwandeln Zu diesem Zweck gibt es Typumwandlungsoperationen Dabei gibt es implizite und explizite Typumwandlungen Eine implizite Typumwandlung erscheint nicht im Quelltext Sie wird vom Compiler automatisch in den erzeugten Maschinen Code eingefugt Voraussetzung dafur ist dass zwischen Ursprungs und Zieltyp eine implizierte Typumwandlungsoperation existiert Fur explizite Typumwandlungen sind in C zwei Konstrukte vorgesehen Zieldatentyp Variable des UrsprungsdatentypsVariable des Ursprungsdatentyps span style color 000 as span ZieldatentypWahrend erstere Umwandlung im Fall einer ungultigen Typumwandlung eine Ausnahme auslost ist Letztere nur moglich wenn der Zieldatentyp ein Referenzdatentyp ist Bei einer ungultigen Typumwandlung wird hier dem Ziel der Nullzeiger zugewiesen using System Collections public class CastBeispiel public static void Main long aLong long MaxValue Typumwandlung nach int aInt hat danach den Wert 1 nicht in einem unchecked Block eingeschlossen wird jedoch eine Ausnahme geworfen unchecked int aInt int aLong Umwandlung nach object object aObject aInt as object ungultige Typumwandlung liste2 erhalt den Wert null IList liste2 aObject as IList ungultige Typumwandlung lost zur Laufzeit eine InvalidCastException aus da das Object nicht vom Typ Liste ist IList liste IList aObject Lost den Kompilierfehler CS0077 aus da int kein Referenztyp ist int aInt2 aLong as int Die unchecked Anweisung bzw Anweisungsblock dient dazu den Uberlauf einer Ganzzahl zu ignorieren Mit checked hingegen wird bei einem Uberlauf ein OverflowException ausgelost Zu den Typumwandlungen gehort auch das sogenannte Boxing Es bezeichnet die Umwandlung zwischen Wert und Referenztypen Der Zieltyp wird wie bei der expliziten Konvertierung in Klammern vor den umzuwandelnden Typ geschrieben Erfolgt dies implizit so spricht man von Autoboxing Benutzerdefinierte Typumwandlungen Bearbeiten C erlaubt die Definition von benutzerdefinierten Typumwandlungen Diese konnen als explizit oder implizit markiert werden Implizite benutzerdefinierte Typumwandlung kommen u a bei der Uberladungsauflosung zum tragen wahrend explizite dann verwendet werden wenn oben genannte explizite Typumwandlungssyntax benutzt wird Siehe auch Operatoren uberladen Explizite TypumwandlungParametrische Polymorphie Generics BearbeitenBei der Definition von Interfaces Klassen Strukturen Delegate Typen und Methoden konnen Typparameter angegeben und gegebenenfalls mit Einschrankungen versehen werden Werden Typparameter angegeben so erhalt man generische Interfaces Klassen und so weiter Bei der spateren Benutzung solcher Generics fullt man die Typparameter mit konkreten Typargumenten Definitionsseitige Ko und Kontravarianz Bearbeiten Ab C 4 ist es moglich Typparametern von Interfaces und Delegate Typen eine Varianzannotation mitzugeben Diese beeinflusst die Subtyprelation Angenommen der generische Typ heisse K und habe einen einzigen Typparameter T Moglich sind dann Kovarianz K lt out T gt Wenn A Subtyp von B ist dann ist K lt A gt Subtyp von K lt B gt Kontravarianz K lt in T gt Wenn A Subtyp von B ist dann ist K lt B gt Subtyp von K lt A gt Invarianz K lt T gt Es gibt keine Untertypbeziehung zwischen Instanziierungen von K mit verschiedenen Typargumenten T Jedem Typparameter kann unabhangig von anderen eine Varianzannotation mitgegeben werden Neben der Fortsetzung von Untertypbeziehungen von Typargumenten auf Instanzen von Generics beeinflusst die Varianzannotation auch an welchen Stellen ein Typparameter benutzt werden darf So sind beispielsweise die Benutzung von kovarianten Typparametern als Typen von Methodenargumenten und die Benutzung von kontravarianten Typparametern als Ruckgabetypen nicht erlaubt Assemblies BearbeitenSiehe NET AssembliesAttribute Metadaten BearbeitenAttribute geben die Moglichkeit Metadaten fur Assemblies Funktionen Parameter Klassen Strukturen Enumerationen oder Felder anzugeben Diese konnen Informationen fur den Compiler enthalten fur die Laufzeitumgebung oder uber Reflexion wahrend der Laufzeit ausgelesen werden In C werden diese mit eckigen Klammern uber dem Ziel angegeben Das STAThread Attribut wird z B benotigt wenn ein Programm COM Interoperabilitat unterstutzen soll Die Fehlermeldung lautet sonst Es wurde eine steuernde IUnknown ungleich NULL angegeben aber entweder war die angeforderte Schnittstelle nicht IUnknown oder der Provider unterstutzt keine COM Aggregation STAThread public static void Main string argumente Attribute selbst sind wiederum Klassen die von der Klasse Attribute abgeleitet sind und konnen beliebig selbst definiert werden Beispiel AttributeUsage AttributeTargets All public class Autor System Attribute public int Age get set public Autor string name Verwendung Autor Name des Autors Autor Name des 2 Autors Age 20 Version 1 0 0 0 public class IrgendeineKlasse Abfrage von Attributen Autor a typeof IrgendeineKlasse GetCustomAttributes typeof Autor false as Autor Ausnahmen Exceptions BearbeitenSchema try offnet den Block um den Codeteil dessen Fehler abgefangen werden sollen unsichere Verarbeitung catch ExceptionTypException exception data Fangt alle Exceptions vom Typ ExceptionTypException tut was wenn ExceptionTypException geworfen wurde catch Exception ex Fangt alle Exceptions welche von Exception abgeleitet wurden tut was wenn Exception geworfen wurde finally Wird zwingend ausgefuhrt Es ist nicht zwingend erforderlich dass immer alle Blocke catch finally angegeben werden Den Umstanden entsprechend kann auf einen try Block auch direkt ein finally Block folgen wenn beispielsweise keine Behandlung einer Ausnahme erwunscht ist Zudem ist es nicht zwingend erforderlich dass auf ein try catch Konstrukt ein finally Block folgen muss Es ist jedoch nicht moglich nur einen try Block zu definieren Ein try Block muss mindestens von einem weiteren Block gefolgt werden Zudem ist es moglich mehrere catch Blocke zu definieren Wird im try Bereich eine Ausnahme ausgelost so werden alle vorhandenen catch Blocke der Reihe nach durchgegangen um zu sehen welcher Block sich um die Ausnahme kummert Somit ist es moglich gezielt verschiedene Reaktionen auf Ausnahmen zu programmieren Wird eine Ausnahme von keinem catch Block abgefangen so wird diese an die nachsthohere Ebene weitergegeben Beispiele vordefinierter Ausnahme Klassen Exception SystemException IndexOutOfRangeException NullReferenceException InvalidOperationException ArgumentException ArgumentNullException ArithmeticException ArithmeticOutOfRangeException OverflowException DllNotFoundExceptionBei der Implementierung eigener nicht kritischer Ausnahmen ist darauf zu achten nicht von der Klasse Exception abzuleiten sondern von ApplicationException Throw Bearbeiten Mittels throw ist es moglich eine in einem catch Block aufgefangene Ausnahme eine Ebene hoher zu werfen weitergeben Somit ist es moglich dass auch nachfolgender Code von der aufgetretenen Ausnahme informiert wird und somit seinerseits Aktionen unternehmen kann um auf die Ausnahme zu reagieren Der Aufruf Stack bleibt erhalten Durch throw kann auch eine neue Ausnahme ausgelost werden beispielsweise eine programmspezifische Ausnahme die nicht durch bereits vorhandene C Ausnahmen abgedeckt wird Unsicherer Code BearbeitenDurch die Codeverifizierung und NET Zugriffsverifizierung werden bei C Speicherzugriffsfehler verhindert Bei Verwendung von Zeigern werden diese Sicherheitsmechanismen umgangen Dies ist nur in der Betriebsart Unsafe Code moglich Beispiel using System class us code public static void Main unsafe int i 1 i hat den Wert 1 int p amp i p zeigt auf den Speicher von i mit dem Wert 1 Console WriteLine p p i i i 2 Sowohl i als auch p haben nun den Wert 2 Console WriteLine p p i i Zudem konnen Klassen und Methoden als unsafe deklariert werden Kommentare und Dokumentation BearbeitenIn C sind wie in C C und Java sowohl Zeilen als auch Blockkommentare moglich Zeilenkommentare beginnen dabei mit zwei aufeinanderfolgenden Schragstrichen und enden in der gleichen Zeile mit dem Zeilenumbruch Alles was nach den Schragstrichen folgt wird bis zum Zeilenende als Kommentar angesehen und vom Compiler ubergangen Blockkommentare die sich uber mehrere Zeilen erstrecken konnen beginnen mit der Zeichenkombination und enden mit Sowohl Zeilen als auch Blockkommentare konnen zu Beginn oder auch mitten in einer Zeile beginnen Blockkommentare konnen in derselben Zeile enden und es kann ihnen Quelltext folgen der vom Compiler ausgewertet wird Alles was innerhalb des Blockkommentars steht wird vom Compiler ubergangen Dies ist ein Zeilenkommentar der mit dem Zeilenumbruch endet System Console WriteLine Ein Befehl Ein Zeilenkommentar am Zeilenende Dies ist ein Blockkommentar der in der gleichen Zeile endet System Console WriteLine Ein weiterer Befehl Ein mehrzeiliger Blockkommentar System Console WriteLine Noch ein Befehl System Console WriteLine Befehl 1 Kommentar System Console WriteLine Befehl 2 System Console Kommentar WriteLine Kommentar Hinweis Es sind auch Kommentare innerhalb einer Anweisung bzw Deklaration moglich z B zur Kommentierung einzelner Methodenparameter Diese Art von Kommentaren sollte aus Grunden der Lesbarkeit und Wartbarkeit vermieden werden Zur Dokumentation von Methoden stellt C in Form von Metadaten Attribute einen Mechanismus bereit der es ermoglicht eine XML basierte Dokumentation erzeugen zu lassen Zur Dokumentation von Typen das heisst Klassen und deren Elemente wie Attribute oder Methoden steht eine spezielle Form von Zeilenkommentaren bereit Hierzu beginnt der Zeilenkommentar mit einem weiteren dritten Schragstrich und befindet sich direkt uber dem zu dokumentierenden Typ z B einer Methode Es folgen nun XML Tags die jeweils eine bestimmte Funktion bei der Dokumentation ubernehmen beispielsweise eine Zusammenfassung durch einen Summary Tag Alternativ kann auch ein Blockkommentar verwendet werden der mit statt eingeleitet wird lt summary gt Diese Funktion gibt den grosseren Betrag zuruck lt summary gt lt param name a gt Der erste Ubergabeparameter lt param gt lt param name b gt Der zweite Ubergabeparameter lt param gt lt returns gt Die Zahl mit dem grosseren Betrag lt returns gt lt remarks gt Diese Funktion gibt den grosseren Betrag der beiden Ubergebenen lt see cref Int32 gt zuruck Sind die Betrage gleich gross ist dies ein Fehler lt remarks gt lt exception cref ArgumentException gt Der Betrag der beiden Zahlen ist gleich gross lt exception gt public int GetGreaterAbs int a int b return Math Max Math Abs a Math Abs b Statt die Dokumentation explizit einzufugen kann auch eine externe Ressource referenziert werden die die Dokumentation enthalt lt include file xml include tag doc path MyDocs MyMembers name test gt Dokumentation im XMLDoc API Dokumentationsformat wird vom Compiler als ein normaler Zeilenkommentar angesehen Erst durch Angabe der Compiler Option doc werden Kommentare die mit drei Schragstrichen beginnen als XMLDoc erkannt und aus dem Quellcode in eine Datei extrahiert Diese kann dann weiterverarbeitet werden z B ahnlich wie bei Javadoc zur Erstellung einer HTML Hilfe verwendet werden NDoc Wenn die Entwicklungsumgebung dazu in der Lage ist kann sie die formalisierte Dokumentation dazu benutzen um an Verwendungsstellen aufgerufener Funktionen deren Beschreibung als Tooltip anzuzeigen ebenso bei der Eingabe von Funktionsparametern Siehe auch Kommentar Programmierung Schlusselworter BearbeitenReservierte Schlusselworter Bearbeiten Die folgenden Bezeichner sind reservierte Schlusselworter und durfen nicht fur eigene Bezeichner verwendet werden sofern ihnen nicht ein Zeichen vorangestellt wird zum Beispiel else abstract asbase bool break bytecase catch char checked class const continuedecimal default delegate do doubleelse enum event explicit extern false finally fixed float for foreachgotoif implicit in int interface internal is lock long namespace new nullobject operator out override params private protected public readonly ref returnsbyte sealed short sizeof stackalloc static string struct switch this throw true try typeofuint ulong unchecked unsafe ushort usingvirtual volatile voidwhile Kontextschlusselworter Bearbeiten Die folgenden Bezeichner sind Kontextschlusselworter das heisst innerhalb eines gultigen Kontextes und nur dort haben sie eine besondere Bedeutung Sie stellen aber keine reservierten Worter dar das heisst ausserhalb ihres Kontextes sind sie fur eigene Bezeichner erlaubt add alias ascending descending equals fromget global group into join let on orderby partial remove select setvalue var whereyieldSiehe auch BearbeitenADO NET ASP NET Mono Anonymer Datentyp NET Framework Class Library In MSDN Microsoft abgerufen am 11 Mai 2013 englisch Klassenbibliotheken des NET Frameworks NDocLiteratur BearbeitenAndreas Kuhnel Visual C 2012 das umfassende Handbuch 6 aktualisierte und erweiterte Auflage Galileo Press Bonn 2013 ISBN 978 3 8362 1997 6 Einzelnachweise Bearbeiten a b Benutzerdefinierte bedingte logische Operatoren Microsoft Developer Network MSDN abgerufen am 25 April 2011 Abgerufen von https de wikipedia org w index php title Sprachelemente von C Sharp amp oldid 238939785