Fachbereich Mathematik und Informatik Softwareprojekt: Spieleprogrammierung Einführung in C# (für Umsteiger) Do, Hoang Viet(do@mi.fu-berlin.de) Freie Universität Berlin, SoSe 2013
Agenda Allgemeines zu C# Besonderheiten in Types Besonderheiten in Datenmembers Konstante Datenmembers Besonderheiten in Funktionale Members Methoden Properties Delegate & Event 2
Die Programmiersprache C# Designziele bei.net: 1. Sprachunabhängig: Mischen von mehreren Programmiersprachen möglich 2. Plattformunabhängig (PC, WinPhone, Xbox, RIA) 3. OS-unabhängig Eigenschaften von C#: Reine objekt-orientiert Ursprünglich statisch typisiert Case-sensitive Unterstützt Unicode Automatische Speicherverwaltung, aber auch unsafe Code möglich! 3
.net - Grundbegriffe Compilation Unit, Source Code C# Compiler (csc.exe) Assemblies Common Intermediate Language (MSIL, CIL) JIT, Jitter Common Language Runtime (CLR) Memory Management, Garbage Collector (GC) Common Type System (CTS) Common Language Specification (CLS) 4
HelloWorld 5
Namespaces Die gesamte.net Framework Class Library (FCL) ist in dem Namensraum System definiert Keyword: using <namespace>; Entspricht dem using aus C++ nicht dem import von Java Übersicht vom.net Framework 4: Link 6
Verbatimstring & -identifier Verbatimidentifier: @<bezeichner> Schlüsselwörter als Namen @ sind nicht Teil des Namens! Verbatimstring: @ <beliebige Inhalt> Keine Übersetzung der Escape Characters Zeichenumbrüche und Tabs sind Teil des Strings (2x) für Beispiel: @ C:\Userfiles 7
Lokale Variablen: nullable types Nullable types <type>? <bezeichner> [= <expr>]; Als <expr> ist nun null möglich Intern: Instanzen der Struktur System.Nullable<T> Beispiel: int? Kinder_von_Hans = 0; int? Kinder_von_Klaus= null; Hans hat keine Kinder. Kinderanzahl von Klaus ist unbestimmt/unbekannt. Null coalescing: int a = b?? -1; Variable a wird den Wert von b zugewiesen, wenn b nicht null ist, ansonsten -1. (b muss nullable type sein) 8
Klassen Syntax: [attributes][accessibility][modifiers] class <identifier> [: <baselist>] { <class_body> } Attributes sind optional Beispiel: Serializable Thema Metadata & Reflection accessibility für Klassen: Zugriffsberechtigung public Eigenen Assembly und referenzierende Assembly internal Nur Eigene Assembly (default) 9
Klassen modifiers: abstract sealed static unsafe Keine Instanzen möglich Keine Ableitung möglich nur statische Methoden unsafe-konstrukte möglich wie pointer. (+ unsafe compiler option) baselist Eine Elternklasse! Keine Mehrfachvererbung möglich Mehrere Interfaces 10
Partielle Typen Anwendungsgebiet: Vorteilhaft bei Teamarbeit (Jeder implementiert seinen Teil!) Definition über mehrere Quelldateien Zusammenfügen bei der Kompilierung Komplette Typ Definition mit Schlüsselwort partial in der jeweiligen Datei. Optional: Partiale Methoden nutzen Alle Definitionen haben die gleichen Zugriffseinschränkung Wenn eine Definition als sealed definiert ist, dann auch Endklasse Als abstract definierit ist, dann Endklasse geerbert wird, dann komplette Endklasse 11
Klassenmembers Do, Hoang Viet 12
Klassenmembers Datenmembers Fields ( Objekteigentschaften ) Constants ( Klassenkonstanten ) Nested Types ( Eingebette Klassen ) Funktionale Members Methoden Konstruktor/ Destruktor Properties & Indexers Delegates Events Operatoren 13
Zugriffsmodifikatoren für Members Zugriffsmodifikator Außerhalb Kinderklassen public Ja Ja internal Ja (innerhalb der AS) Ja (innerhalb der AS) internal protected Ja (innerhalb der AS) Ja protected Nein Ja private Nein Nein 14
Datenmembers Do, Hoang Viet 15
Konstante Datenmembers Klassenkonstanten Syntax: [accessibility] [modifier] const <type> <identifier> = <const_expr>; Werden zur Kompilierungszeit erzeugt und bleiben persistent über die gesamte Laufzeit Klassengebunden readonly Fields Wertsetzung wird im Konstruktor durchgeführt (sprich zur Laufzeit) Objektgebunden 16
Beispiel: konstante Werte class Figur { const int c = 100; const string a = "blah"; int c = 100; readonly string _name; } public Figur(string name) { } _name = name; Do, Hoang Viet 17
Funktionale Members Do, Hoang Viet 18
Klassenmembers Datenmembers Fields ( Objekteigentschaften ) Constants ( Klassenkonstanten ) Nested Types ( Eingebette Klassen ) Funktionale Members Methoden Konstruktor/ Destruktor Properties & Indexers Delegates Events Operatoren 19
Methoden Syntax: [attributes] [accessibility] [modifiers] <return_type> <identifier> ([parameter_list]) { [statement;] }; [attributes] Obsolete, StrongNameIdentityPermission, InternalsVisibileTo [accessibility] private, public, protected, internal, internal protected 20
Konstruktoren Klassen haben immer einen Konstruktor Wenn keine definiert, dann Default Constructor: Weist default values den Fields zu Überladung möglich Funktionsauflösung durch new Operator Wenn ein eigene Constructor mit Parameter definiert wurde, muss Default- Constructor selbst definiert werden Konstruktoren können die this-referenz benutzen um sich gegenseitig aufzurufen (selbst der Default Constructor). Aber nicht innerhalb des Funktionsrumpf! colon syntax, nur für Konstruktoren verfügbar 21
Beispiel: colon-syntax class CBook { int _pages; string _isbn, _author; } CBook() : this(0, "", "") { } CBook(int pages) : this(pages, "", "") { } CBook(int pages, string author, string isbn) { //... } Do, Hoang Viet 22
Klassenkonstruktor Zweck: Initialisieren von static fields Aufruf: Werden nicht explixit aufgerufen! Sondern wenn die Klasse zum ersten Mal referrenziert wird. Einschränkungen Keine accessibility Keine Parameter Können nicht überladen werden 23
Beispiel: Object initializer Person p = new Person() { FName = Bruce", LName = Wayne", WorkP = new Address() { City = Gotham City } }; Do, Hoang Viet 24
Destruktoren (engl. Destructor) Syntax: [extern] ~<typename>() {[func_body]}; Werden nicht explixit gerufen, sondern vom Garbage Collector zur unbestimmten Zeit Werden vor dem Entfernen des Objektes aufgerufen Achtung, dass ist nicht gleich dem Ende vom Scope. Methode mit selben Name wie Klasse mit Prefix ~ (Tilde) 25
Properties Ein Field, das mit eine get & set Methode realisiert wird. get als R-value, genutzt innerhalb eines Ausdruckes set als L-value Beide werden nicht direkt aufgerufen. Einige Vorteile gegenüber Field Stabiler als public & protected fields, da eine Überprüfung stattfindet Write-only & read-only möglich; Fields nur read-only Können in interfaces aufgenommen werden; Fields nicht 26
Properties Syntax: [accessibility] [modifier] <type> <identifier> { [accessibility] get {[f_body]} [accessibility] set {[f_body]} } [accessibility] kann von einem der beiden geändert werden set: Implixit einen Parameter. Schlüsselwort value get: Keine Parameter Rückgabewert vom identifier 27
Beispiel: Properties class CPerson { string fname =null, lname =null; } int _age; public int age { get { return _age; } set { _age = value;} } public string fullname { get { return fname + ", "+ lname; } } Do, Hoang Viet 28
Delegate Funktionspointer als Typ Funktionsdeklaration mit Schlüsselwort delegate Syntax: [modifier] delegate <func_decl>; 29
Event Syntax: event <Delegate> <ident>; Subscribe: <ident> += <EventHandler>; Die Funktionssignatur vom EventHandler ist durch das Delegate gegeben. Unsubscribe: <ident> -= <EventHandler>; Die Funktionssignatur vom EventHandler ist durch das Delegate gegeben. Event auslösen <ident>( ); Die Parameterliste ist durch das Delegate gegeben. 30
Vererbung Do, Hoang Viet 31
Members überschreiben Überschreibar sind alle funktionale instance-members (Methoden, Properties, Indexers und Events) Data Members und Static Members können nur versteckt werden. Durch das Überschreiben entstehen Probleme fragile base class problem in C# wie in C++: Elternklasse muss es explicit erlauben! In Java per default erlaubt 32
virtual und override base-class erlaubt mit Schlüsselwort virtual Gilt nicht nur für die unmittelbare derived-class Funktionale Instance-Members: Methoden, Properties, Indexers und Events derived-class überschreibt mit Schlüsselwort override Zu Properties: man kann nicht read-/write-only verändern! Schlüsselwort base : Zugriff auf unmittelbare base-class (nur public & protected) base.base.member ist nicht möglich! 33
Konstruktor & Destruktor werden nicht vererbt! Alle Konstruktoren der Vererbungskette werden aufgerufen (bottom-up: Urklasse als Erstes) Per default, wird der Standardkonstruktor aufgerufen. Für andere Konstruktoren colon-syntax benutzen mit base statt this Die Benutzung von base(this) ist nicht möglich, da das Objekt noch nicht erstellt wurde. Destruktoren in umgekehrte Reihenfolge 34
Erweiterungsmethode (engl. Extension Method) Erweitern von versiegelten Typen wie Wertetypen Statische Methoden in statische Klassen Type: Erste Parameter beginnt mit this und dem zu erweiternden Type Aufruf als gehöre Methode zur ursprünglichen Type Interface: Auch anwendbar für interfaces Aufrufbar von allen Types mit dem interface 35
Erweiterungsmethode (engl. Extension Method) Wenn Instanzmethode und Erweiterungsmethode die selbe Signatur haben, wird die Instanzmethode gerufen. Wenn 2 Erweiterungsmethode die selbe Signatur haben, muss man die Methode explicit aufrufen. Erweiterungsmethode gilt nur für den Namensraum, indem es definiert ist! 36