web Flashcards
Was ist Eine Variable ?
Variablen sind das wichtigste konzept in der Programmierung
Deklaration
Private int anzahl;
Intilialisirung
Private int anzahl=0;
Was ist eine konstante Variable?
Eine Variable derernwert wäjrend der Ausführung des programms nicht geändert werden kann.bedeutet dass wir der konstanten Variablen zur Laufzeit keine werte zuweisen.
Komplierzeit Konstanten
werden mit Schlüsselwort const deklariert
Laufzeit Konstanten
werden mit Schlüsselwort credonly deklariert
const
erlaubt nur konstante variablen im Ausdruck . kann so wohl auf klassenebene als auch innerhalb der Methode deklariert werden . kann nicht mit dem schlüsselwort static deklariert werden da sie standardmäßig statisch ist .
Strukturtyps
Beim Design eines Strukturtyps können im Wesentlichen dieselben Member eingesetz werden wie bei einer Klassendefinition. Eine Variable vom Typ einer Struktur enthält jedoch keine Referenz
auf ein Heap-Objekt, sondern alle Feldinhalte ihres Typs.Eine Variable vom Typ einer Struktur enthält jedoch keine Referenz
auf ein Heap-Objekt, sondern alle Feldinhalte ihres Typs.
Wie bei Variablen mit einem elementaren Datentyp liegt keine
Referenz-, sondern eine Wertsemantik vor.
Strukturen
Kleine Instanzen,Wertsemantik erwünscht,Nullinitialisierung akzeptabel, Keine Vererbung erforderlich
Kleine Instanzen
Der Typ ist relativ einfach aufgebaut, hat also nur wenige Instanzvariablen. z.B. Punkte in einem
zwei oder drei dimensionalem Raum.
Wertsemantik erwünscht
Bei einem Methodenaufruf wird eine als Wertparameter verwendete Strukturinstanz komplett
kopiert, während von einem Parameterobjekt nur die Adresse übergeben wird. Das Original der
kopierten Strukturinstanz wird durch den Methodenaufruf nicht verändert, was beim
Parameterobjekt hingegen möglich ist.
Nullinitialisierung akzeptabel
Bei einer Struktur muss sichergestellt sein, dass die Nullinitialisierung aller Felder zu einer
regulären Instanz führt.
Keine Vererbung erforderlich
Bei Strukturen fehlt die Möglichkeit, per Vererbung eine Hierarchie spezialisierter Typen
aufzubauen. Das Implementieren von Schnittstellen ist aber möglich.
Strukturen
Sie können ohne den Operator new ein Objekt erzeugen, wenn die Struktur
ausschließlich Felder hat und keine Methoden. Enthält die Struktur jedoch
Methoden, müssen zuerst alle Felder initialisiert werden, um die Methoden des
Objekts fehlerfrei aufrufen zu können.
Konstruktoren in Strukturen
Standardmäßig stellt eine Struktur einen parameterlosen Konstruktor bereit, der
mit new-Operator aufgerufen werden kann.
Strukturen lassen die Definition weiterer Konstruktoren zu, die jedoch
parametrisiert sein müssen, denn das Überschreiben des parameterlosen
Konstruktors einer Struktur ist nicht erlaubt. Fügen Sie einen parametrisierten
Konstruktor hinzu, muss eine Bedingung erfüllt werden: Alle Felder der Struktur
müssen initialisiert werden.
Enumerationen
C# bietet mit den Enumerationen (Aufzählungstypen) eine Lösung, die
folgende Vorteile hat:
› Gut lesbarer Quellcode durch Klartextnamen für die Merkmalsausprägungen
› Abweisung von falsch geschriebenen Klartextnamen durch den Compiler
› Geringer Speicherbedarf
› Eine Enumeration basiert auf einem zugrunde liegenden integralen Typ (meist
int) und enthält eine (meist kleine) Menge von benannten Konstanten dieses
Typs.
Objektinitialisierer
public Felder und Eigenschaften (Properties) können bei der Objekterzeugung
auch ohne spezielle Konstruktordefinition (parametrisierter Konstruktor)
initialisiert werden.
› Dazu wird hinter den Konstruktoraufruf eine durch geschweifte Klammern
begrenzte Liste von Name-Wert - Paaren gesetzt, die man als
Objektinitialisierer bezeichnet.
Anonyme Klassen
Als Innenausstattung enthält die anonyme Klasse eine öffentliche get-only –
Eigenschaft(Propertie) für jedes Element in der Liste des Objektinitialisierers.Eine anonyme Klasse erbt die Methoden ihrer Basisklasse Object. Aufgrund
ihrer Entstehungsgeschichte können anonyme Klassen über das Object-Erbgut
hinaus keine Handlungskompetenzen besitzen.
Nullable Datentypen
NULL bedeutet nichts – eine Variable, die keinen Wert hat.
› Vor dem Zugriff auf einen Wert, muss sichergestellt werden, dass eine Variable
einen Wert hat. Sonst NullReferenceException!
› NULLEN sind besonders relevant, wenn es um eigene Objekte und Strings geht.
› Zahlen haben immer einen Standartwert. z.B. 0 (die Zahl Null, weil Wertetyp)
› Einer integer Variablen kann kein NULL-Wert zugewiesen werden. Es sei denn,
wir definieren es als Nullable.
› Definition einem nullable Variable mit einer ? (Fragezeichen) nach Typ.Bei der Deklaration von Nullable-Variablen ohne Initialisierung haben die
Variablen den Wert null.
Nullable Datentypen
Operatoren (+, -, etc.)
› Liefern als Ergebnis null falls einer der beiden Operanden null ist
› Vergleichsoperatoren (>, >=, etc.) liefern false, falls einer der beiden
Operanden null ist
› == liefert true, falls beide null sind
› Nullable Variablen sind mit null vergleichbar
Verwenden eines Nullwerts
Nullable-Objekte kommen immer von einem Basisdatentyp, z.B. eine Ganzzahl
wie in den vorherigen Beispielen. Während diese Datentypen einen
Standardwert haben können, ist der Standardwert eines Nullwerts immer Null.Ein Nullable-Typ erbt auch eine sehr nette Hilfsmethode, die Sie verwenden
können: GetValueOrDefault().
Methodenüberladung
Besitzt eine Klasse mehrere Methoden mit demselben Namen, liegt eine sogenannte
Überladung von Methoden vor. Eine Überladung ist erlaubt, wenn sich die Signaturen der
beteiligten Methoden unterscheiden. Zwei Methoden besitzen genau dann dieselbe Signatur, was innerhalb einer Klasse verboten
ist, wenn die folgenden Bedingungen erfüllt sind: Die Namen der Methoden sind identisch.Die Parameterlisten sind gleich lang Positionsgleiche Parameter haben denselben Datentyp.
› Positionsgleiche Parameter haben denselben Transfermodus, d.h.:
› Beide sind Wertparameter,
› oder beide sind Verweisparameter.
› Bei zwei Verweisparametern sorgen unterschiedliche Richtungsangaben (ref, in, out) nicht für
abweichende Signaturen.
Operatorenüberladung-Regeln
Geschieht durch Definition statischer Memberfunktionen und durch
Verwendung des operator-Schlüsselworts
Es können nicht alle Operatoren überladen werden
Bei einigen Operatoren bestehen Einschränkungen
Nur bestehende Operatoren können überladen werden
Es können keine neuen Operatoren „erzeugt“ werden
Die Operationen von Operatoren auf den elementaren Datentypen können
nicht umdefiniert werden.
Die Grundfunktionalität eines Operators bleibt immer erhalten: Ein binärer
Operator benötigt immer zwei Operanden, ein unärer immer nur einen.
Operatorenüberladung-Einschränkungen
Einige Operatoren können nur paarweise überladen werden.
Wollen Sie zum Beispiel den Vergleichsoperator »==« überladen, müssen Sie
auch den Operator »!=« überladen.
Damit erzwingt C# eine konsistente Prüfung auf Übereinstimmung und
Nichtübereinstimmung.
Zuweisungsoperator »=« kann nicht überladen werden.
Überladen Sie einen binären Operator, z. B. »+«, wird der
Additionszuweisungsoperator »+=« automatisch implizit überladen.
Andere nichtüberladbare Operatoren: der Punktoperator, der bedingte
Operator »?:« sowie die Operatoren new, is, typeof und sizeof.
Operatorenüberladung-Aufbau
In der Klasse muss eine Methode mit der richtigen Signatur erstellt werden
Überladung muss
public sein
static sein
operator – Schlüsselwort enthalten
Operationszeichen enthalten
Syntax für Binäre Operanden:
public static Typ operator +(Typ t1, Typ t2) { … }
Syntax für Unäre Operanden:
public static Typ operator ++(Typ t1) { … }
Überladung von Konvertierungsoperatoren
Konvertierung zwischen Datentypen sind implizit und explizit möglich.
byte zahl1 = 5;
› int zahl2 = zahl1;
// Implizite Umwandlung
——————————————-
int zahl3 = 7;
› byte zahl4 = (byte)zahl3;
// Explizite Umwandlung
——————————————–
Schlüsselwort implicit
› Rest wie bei der Operatorüberladung
› public static implicit operator ZielTyp (Ursprungstyp) { … }
Explizite Umwandlung
Explizite Umwandlung ist ebenfalls überladbar
› Vermeidung einer automatischen Umwandlung
› Ggf. nicht gewünscht
› Ggf. nicht bewusst verwendet
› Eine Umwandlung ist ggf. mit Datenverlust verbunden
› Die Umwandlung sollte in diesem Fall explizit sein
› Explizite und Implizite Umwandlung nicht parallel mit gleichen Datentypen
möglich
Motivation
Angenommen wir
brauchen einen Stack für
string-Werte.
›Wir schreiben also eine
Klasse StringStack.
› Die Klasse verwaltet
Elemente nach dem
LIFO-Prinzip (Last In,First
Out).
›Wir können Elemente
hinzufügen (Push) und
wieder entfernen (Pop).
Lösung gewährleistet Typsicherheit
› Führt ggf. zu einer großen Anzahl ähnlicher Klassen für
einen spezifischen Typ
› Klassen sind schlecht zu warten
› Ggf. wird in Zukunft ein weiterer Stack mit einem noch nicht
berücksichtigten Typ nötig
Motivation-Problem mit object
Bei der Methode Pop gibt es Probleme, weil die Methode einen Wert vom Typ
object zurückgibt. Es muss eine explizite Konvertierung durchgeführt werden,
um wieder zum Typ des Elements zu kommen.
DRY-Prinzip
ie Klassen, die wir erstellt haben unterscheiden sich nur
bei der Typangabe. Alles andere ist vollkommen identisch.
› Verstoß gegen DRY-Prinzip.
› Das DRY Prinzip besagt, dass Codeduplizierungen
vermieden werden sollten.
Generics
Generics stellen Platzhalter für Datentypen zur Verfügung
› Dies gilt für Klassen, Methoden und Variablen
› Generics erlauben die Verwendung von Datentypen, welche zum Zeitpunkt
der Entwicklung noch nicht feststehen
› Häufig wird ein großgeschriebenes T in spitzen Klammern <T> als Platzhalter
verwendet
› Es können aber auch andere Buchstaben und , durch Komma getrennt, weitere
Typen hinzugefügt werden.
Bei der Instanziierung der Klasse wird der generische Typparameter durch
einen konkreten Datentyp ersetzt.</T>
Typgenerisches Programmieren
Wiederverwendung von Code .
Typsicherheit.
Performanz.
Generische Typen sind Datentypen, die mit anderen Typen
parametrisiert werden.
› Man schreibt allgemeingültigen Code für eine Klasse, der
mit mehreren Datentypen funktioniert.
› Der Benutzer der Klasse entscheidet bei der
Instanziierung, welcher konkrete Datentyp verwendet
werden soll.
› Dadurch ist die Klasse sowohl allgemeingültig als auch
typsicher.
Generische Typen.
sind Datentypen, die mit anderen Typen
parametrisiert werden.
allgemeingültigen Code
Man schreibt allgemeingültigen Code für eine Klasse, der
mit mehreren Datentypen funktioniert.
Generics-Vorteile
Sie erlauben das Schreiben von Typen oder Methoden, die für mehrere Typen
anwendbar sind und dennoch Typsicherheit bieten.
Durch den Einsatz von Generics kann der Compiler beim Erstellvorgang
überprüfen, ob der angegebene Code korrekt ist.
Bei Wertetypen tritt bei Generics kein Boxing bzw. Unboxing auf, was die
Performance erhöht.
Generics fördern das DRY-Prinzip, da man denselben Code für beliebig viele
unterschiedliche Typen nutzen kann.
Es ist nicht mehr erforderlich ähnliche Klassen je Datentyp zu schreiben.
Generische Methoden
Methoden können ebenfalls generisch sein.
Sie müssen nicht zu einer generischen Klasse gehören.
Im Vergleich zu mehreren überladenen Methoden, die analoge Operationen mit
verschiedenen Datentypen ausführen, ist eine generische Methode oft die
bessere Lösung..
Constraints
Soll innerhalb des Codes einer generischen Klasse ein bestimmtes
Klassenmitglied des verwendeten Typs aufgerufen werden (z.B. eine Methode),
ist eine explizite und damit auch eine unsichere Umwandlung notwendig.
› Fehler, die ggf. auftreten könnten, werden erst zur Laufzeit erkannt
Constraints – new()
Annahme: wir möchten in einer generischen Klasse ein Objekt vom Typ des generischen
Typparameters erzeugen.
Problem: C#-Compiler weiß nicht, ob die den Typparameter ersetzende Klasse einen
passenden Konstruktor hat. Die Folge wäre ein Kompilierfehler.
Lösung: Constraint new() anhängen