C# Flashcards
Was ist der wesentliche Unterschied zwischen C# und einer herkömmlichen Programmiersprache?
Managed:
- nicht in Maschinensprache kompiliert, sondern in Intermediate Language
- virtuelle Maschine für die Ausführung
- automatisches Speichermanagement
Was versteht man unter Garbage Collection?
Garbage Collection ist eine automatische Speicherverwaltung. Es werden dabei zur Laufzeit nicht länger benötigte Speicherbereiche automatisch identifiziert und freigegeben.
Simple Garbage Collection
- Start: wenn nicht mehr genügend Speicher für die Applikation vorhanden ist oder nach direktem Aufruf
-
Ablauf:
- Warten, bis alle managed Threads in einem sicheren Zustand sind
- Erstellen eines Graphen mit allen erreichbaren Objekten – von den „Root References“ ausgehend
- Erreichbare Objekte werden am Heap komprimiert
- das übrig gebliebene Memory wird freigegeben
- Referenzen zu den verschobenen Objekten werden aktualisiert
Was sind Properties und wozu werden sie verwendet?
Mischung aus Methode und Datenfeld
- Auch Zugriffsmethoden sind eigentlich normale Methoden, die einzelne Eigenschaften (Attribute) eines Objekts abfragen (get) oder ändern können(set)
- Verwendung im Aufrufenden Code wie Datenmember
- Zugriff erfolgt über get- und set-Accessor-Methode
- berechnete Werte
- auf Änderungen reagieren
- read-and-write, read-only, write-only
Was versteht man unter Casting?
- In C# kann jedes Objekt auf alle seine Basistypen umgewandelt werden.
- Alle Klassen in C# erben entweder direkt oder indirekt von der Klasse Object.
- Die Zuweisung eines abgeleitet Objekts zu einem Objekt einer Basisklasse erfordert keine spezielle Syntax.
- Es ist jedoch ein expliziter Cast erforderlich wenn eine Basisklasse auf ein abgeleitets Objekt gecastet wird.
- Laufzeitfehler: InvalidCastException
Was versteht man unter Boxing? Beispiel
Boxing bezeichnet die Umwandlung von Werttypen in object (Referenztyp)
- object-Instanz wird allokiert
- Wert wird in die Instanz kopiert
int x = 10;
object o = x;
Unboxing: Werttyp aus object extrahieren
- int y = (int)o;
Kann zu schlechter Performance führen
InvalidCastException
Wie werden Parameter übergeben?
In C# können Parameter als Werte oder als Verweis an Parameter übergeben werden. Durch die Übergabe als Verweis kann der Wert des Parameters geändert werden und diese Änderung bleibt in der Aufrufumgebung erhalten. Um einen Parameter als Verweis zu übergeben, verwendet man ref oder out.
Ein Argument, das an einen ref-Parameter übergeben wird, muss vor der Übergabe initialisiert werden. Dies unterscheidet sich von den out-Parametern, deren Argumente nicht explizit initialisiert werden müssen, bevor sie übergeben werden.
Member einer Klasse können keine Signaturen haben, die sich nur durch ref oder out voneinander unterscheiden.
Was ist ein Event?
- Events erlauben es einem Objekt
(publisher) ein anderes Objekt (receiver)
darüber zu informieren, dass etwas passiert ist. - Events werden mit Delegates definiert.
- Der Receiver hängt sich an das Event
mit einer Event Handler Methode,
die den Anforderungen des Event Delegates
entspricht. Diese Methode wird ausgeführt,
wenn das Event ausgelöst wird.
public event PropertyChangedEventHandler
PropertyChanged;
private void OnPropertyChanged
(string propertyName)
{
this.PropertyChanged?.Invoke
(this, new PropertyChangedEventArgs
(propertyName));}
arcDiagramSettings.PropertyChanged
+= this.ArcDiagramSettings_PropertyChanged;
private void ArcDiagramSettings_PropertyChanged(object sender, PropertyChangedEventArgs e){}
Was ist ein Delegate?
Ein Delegate ist ein Objekt das einen Verweis für eine Methode aufnehmen kann.
Die Methode müssen die gleichen Parameter und Rückgabewerte wie der Delegate haben.
Erzeugung mit Referenz auf:
- static Methode
- Instanzmethode
- Codeblock (anonyme Methode) –> delegate(bool state) {}
- Lambda Expression = Ausdruck, der eine Methodenreferenz liefert
Aufruf
- erfolgt mit Hilfe des Delegate-Objekts
- unter Angabe der aktuellen Parameter
handler1(true);
handler1.Invoke(true);
private delegate void aufruf(string s, string x);
private void m1(string str1, string str2)
{
MessageBox.Show(str1 + “ “ + str2);
}
aufruf myAufruf1 = new aufruf(m1); myAufruf1("Hallo", "Welt");
Was ist ein Assembly?
Ein Assembly ist der complierte Code in MSIL (Microsoft Intermediate Language) als .exe oder .dll zusammen mit Metadaten.
Assemblies sind die Grundbausteine von .NET Anwendungen. Assemblies sind nichts weiter als Dateien mit der Endung .exe bzw. .dll. Pro Projekt in einer Solution gibt es eine Assembly.
Wie werden in C# Threads programmiert?
Klasse Thread
- kapselt einen Thread
- Eigenschaften: Name, IsBackground, Priority
Delegates für die Thread-Methode.
Thread thread = new Thread(ThreadMethod);
thread. Name = “Mein 1. Thread”;
thread. Start();
Wie werden in C# Threads synchronisiert?
Probleme beim Zugriff auf gemeinsame Daten
- Wettlaufsituation (Race Condition) – mehrere Threads verändern unkontrolliert gemeinsame Daten
- Verklemmung (Deadlock) – Threads warten auf Objekte, die der jeweils andere blockiert hat
–> Gemeinsamen Zugriff vermeiden
Möglichkeiten der Synchronisation im .NET
- Synchronized contexts
- *Synchronization Attribute:** bietet Synchronisation für Objekte vom Typ ContextBoundObject:
- nur Instanzfelder und –methoden werden synchronisiert (nur ein Thread kann gleichzeitig zugreifen)
- statische Felder und Methoden werden nicht synchronisiert (Zugriff ist nicht geschützt)
-
Synchronized code regions
-
MethodImplAttribute mit Option Synchronized:
- nur 1 Thread darf die Methode gleichzeitg ausführen
- für Instanz und statische Methoden
-
Monitor:
- Objekt für die Synchronisation von Statements
- Kurzschreibweise mit dem Lock-Statement
-
MethodImplAttribute mit Option Synchronized:
-
Manuelle Synchronisation z.B.
-
ReaderWriterLock
- erlaubt gleichzeitig entweder 1 Schreib-Thread oder beliebig viele Lese-Threads
- AcquireReaderLock/ReleaseReaderLock: Lock fürs Lesen
- AcquireWriterLock/ReleaseWriterLock:Lock fürs Schreiben
-
ReaderWriterLock
Was ist ein Namespace?
Das namespace-Schlüsselwort wir verwendet um einen Bereich zu deklarieren, der einen Satz von verknüpften Objekten enthält.
Namespaces verfügen über folgende Eigenschaften:
- Sie organisieren große Codeprojekte.
- Sie werden mit dem Operator . begrenzt.
- Das using-Schlüsselwort kann verwendet werden, um nicht den ganzen Namen angeben zu müssen.
Wann wird der Destruktor ausgeführt?
Der Programmierer kann nicht steuern, wann der Destruktor aufgerufen wird, da dies durch den Garbage Collector bestimmt wird. Der Garbage Collector sucht nach Objekten, die von der Anwendung nicht mehr verwendet werden. Wenn er ein Objekt findet, das entfernt werden könnte, ruft er den Destruktor auf (wenn vorhanden) und beansprucht den durch das Objekt belegten Speicherplatz. Destruktoren werden darüber hinaus beim Beenden des Programms aufgerufen.
- Destruktoren werden zur Zerstörung von Klasseninstanzen verwendet.
- Im Destruktor sind Anweisungen enthalten, die die vom einem Objekt beanspruchten Fremdressourcen (unmanaged) freizugeben (z.B. Datenbankverbindungen, Dateien).
- Desturktoren können nicht für Strukturen definiert werden.
- Eine Klasse darf nur einen Destruktor besitzen.
- Destruktoren können nicht aufgerufen werden. Der Aufruf wird automatisch vollzogen.
Was ist der Unterschied zwischen class und struct?
- Class ist ein Referenztyp und Struct ein Werttyp.
Struct ist ein benutzerdefinierter Werttyp
- enhalten Datenfelder, Methoden, Properties
- Konstruktoren
- dienen der Initialisierung der Datenfelder
- Defaultkonstruktor gibt es immer, kann nicht selbst definiert werden
- Keine Vererbung zwischen Strukturen (sealed)
- Speicherplatz-Allokation mit Deklaration
- Initialisierung unbedingt erforderlich vor der Verwendung
- TimeSpan, DateTime
Was versteht man unter Operator Overloading? Wozu wird dies i.d.R. benötigt?
Klassen und Structs können Operatoren überladen.
public static Complex operator +(Complex a, Complex b) {}
Damit wird die Operation für Instanzen der Klasse/Struct verfügbar
Möglich u.a. für
- Arithmetische Operatoren(+ - * / %)
- Vergleichsoperatoren (== != < < <= >=)
- müssen paarweise überladen werden
- Bitoperatoren(& | ^ ~)
- Shiftoperatoren(<< >>)
- Inkrement, Dekrement(++ –)
Nicht möglich für
- Zuweisungen(= += -= usw.)
- Die Abkürzungen stehen aber implizit zur Verfügung
- Logische Operatoren && und ||
- Indexoperator []
- Memberzugriff .