Inhaltsverzeichnis. 1 Einleitung 1. 2 Einordnung 2 2.1 Geschichte und Entwicklung der Sprache... 2 2.2 Vorgängersprachen... 3 2.3 Paradigmen...



Ähnliche Dokumente
Java: Vererbung. Teil 3: super()

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Grundlagen von Python

Einführung in die Java- Programmierung

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Vererbung & Schnittstellen in C#

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung

C# im Vergleich zu Java

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Java Kurs für Anfänger Einheit 5 Methoden

Prinzipien Objektorientierter Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Zählen von Objekten einer bestimmten Klasse

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Programmieren in Java

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Arbeiten mit UMLed und Delphi

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

SEMINAR Modifikation für die Nutzung des Community Builders

Innere Klassen in Java

Zeichen bei Zahlen entschlüsseln

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Programmieren was ist das genau?

Informationen zur Verwendung von Visual Studio und cmake

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup Conrad Kobsch

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Robot Karol für Delphi

Informatik 12 Datenbanken SQL-Einführung

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Vorkurs Informatik WiSe 15/16

Einführung zum Arbeiten mit Microsoft Visual C Express Edition

2. Einrichtung der ODBC-Schnittstelle aus orgamax (für 32-bit-Anwendungen)

Vorkurs C++ Programmierung

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Installation und Inbetriebnahme von Microsoft Visual C Express

Bilder Schärfen und Rauschen entfernen

4 Vererbung, Polymorphie

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG mitp/bhv

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Javakurs 2013 Objektorientierung

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Step by Step Webserver unter Windows Server von Christian Bartl

Anleitung über den Umgang mit Schildern

.htaccess HOWTO. zum Schutz von Dateien und Verzeichnissen mittels Passwortabfrage

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Übung: Verwendung von Java-Threads

C++11 C++14 Kapitel Doppelseite Übungen Musterlösungen Anhang

Kapitel 6. Vererbung

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Übungen zur Softwaretechnik

! " # $ " % & Nicki Wruck worldwidewruck

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

4D Server v12 64-bit Version BETA VERSION

Einführung in Eclipse und Java

SEP 114. Design by Contract

Einführung in die Programmierung

Software Engineering Klassendiagramme Assoziationen

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen

Meet the Germans. Lerntipp zur Schulung der Fertigkeit des Sprechens. Lerntipp und Redemittel zur Präsentation oder einen Vortrag halten

5. Tutorium zu Programmieren

Einführung in das Microsoft.NET-Framework. Programmiersprache C# 02: Visual Studio / Hello World. Boris Hülsmann

8a. Exkurs.NET. 8a.1.NET Architektur

Datensicherung. Beschreibung der Datensicherung

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

.NET Code schützen. Projekt.NET. Version 1.0

Vermeiden Sie es sich bei einer deutlich erfahreneren Person "dranzuhängen", Sie sind persönlich verantwortlich für Ihren Lernerfolg.

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

Visual Basic Express Debugging

Typumwandlungen bei Referenztypen

Tutorium Informatik 1. Aufgabe 2: Formatierte Ein- und Ausgabe

Technische Dokumentation SilentStatistikTool

Kapitel 6. Vererbung

impact ordering Info Produktkonfigurator

Qt-Projekte mit Visual Studio 2005

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Programmierkurs Java

Einführung in PHP. (mit Aufgaben)

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Artikel Schnittstelle über CSV

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Programmieren Tutorium

Berechnungen in Access Teil I

1. Einführung. 2. Die Abschlagsdefinition

Transkript:

Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion Institut für Informatik Christian-Albrechts-Universität zu Kiel Seminararbeit C# - Die.NET Sprache Thoren Horstmann WS 2012/2013 Betreuer: Fabian Reck

Inhaltsverzeichnis 1 Einleitung 1 2 Einordnung 2 2.1 Geschichte und Entwicklung der Sprache................... 2 2.2 Vorgängersprachen............................... 3 2.3 Paradigmen................................... 3 3 Das.NET-Framework 4 4 Technische Unterstützung 6 5 Konzepte und Struktur 7 5.1 Sprachbeschreibung............................... 8 5.2 Konzepte.................................... 9 5.2.1 Operator Overloading......................... 9 5.2.2 Generics................................. 10 5.2.3 Reection................................ 11 5.2.4 Anonyme Funktionen......................... 12 5.2.5 LINQ.................................. 14 6 Zusammenfassung und Fazit 16 ii

1 Einleitung C# hat es in kürzester Zeit geschat, eine der weltweit meist benutzten Programmiersprachen zu werden. Doch wieso eigentlich? Nun zum einem, weil Microsoft es so wollte. C# wurde geschaen um Software für Windows zu schreiben und alle, die das machen, werden sich auf jeden Fall mit C# auseinandersetzen müssen. Zum anderen ist der Übergang von Java oder C++ so einfach, dass man ohne viel Eingewöhnungszeit in C# einsteigen und anfangen zu programmieren kann. In der folgenden Arbeit werde ich C# und dessen Laufzeitumgebung, das.net Framework vorstellen und deren verschiedene Aspekte näher erläutern. Dafür gehe ich zuerst auf die Entstehung und Einordnung der Sprache C# ein, gefolgt von einer Einführung in das.net Framework. Es wird klar werden, wieso C# die wichtigste.net Sprache ist und wieso das.net Framework heutzutage für so viele Anwendungen auf Windows benutzt wird. Im folgenden zeige ich auch noch einmal eine Alternative zu.net, nämlich das Open-Source Projekt Mono. Als letztes, groÿes Kapitel wird die Sprache C# in ihrer Syntax und Struktur vorgestellt und es wird klar werden, wieso der Übergang zu C# so einfach ist. Zudem werden verschiedene wichtige Features von C# mit Beispielen erklärt. Zum Schluss kommt noch einmal eine kleine Zusammenfassung und ein Fazit meinerseits. 1

2 Einordnung 2.1 Geschichte und Entwicklung der Sprache C# ist eine Objekt-orientierte Programmiersprache und wurde in den späten 1990er im Zuge der.net-framework Entwicklung von Microsoft entwickelt. Leiter des Entwicklungsteams ist Anders Heijlsberg, der unter anderem in den 1980er turbopascal und später Delphi mitentwickelte. Abbildung 2.1: Anders Heijlsberg C# wurde ausschlieÿlich für das.net-framework konzipiert, wobei versucht wurde, das Beste aus bereits etablierten Sprachen wie Java, C++ und C zu kombinieren, ohne die Nachteile zu übernehmen. Die erste alpha Version wurde Mitte 2000 vorgestellt und zur Normierung bei der Ecma International (Ecma), einer privaten Normungsorganisation mit Sitz in Genf, eingereicht. Im Januar 2002 wurde C# 1.0 von Microsoft veröentlicht und im gleichen Jahr im Dezember von der Ecma genormt. 2003 folgte die Normierung durch die ISO/IEC. C# 2.0, im September 2005 veröentlicht, brachte viele Neuerungen, wie z.b. Generics und Anonyme Methoden, das sind Methoden, die nur eine Referenz aber keinen Namen haben. Die Version 2.0 wurde im Juni bzw. September von der Ecma, ISO/IEC genormt. Im November 2007 kam dann die Version 3.0, die wichtige 2

2 Einordnung Neuerungen, wie zum Beispiel Lambda Ausdrücke und LINQ (Language-integrated query) brachte. Lambda Ausdrücke sind eine neue Form von anonymen Methoden, die eine funktionale Programmierung ermöglichen. Mit LINQ können Anfragen in SQL ähnlicher Syntax ausgeführt werden. Genauere Beispiele folgen im Kapitel Konzepte. Die neuere Versionen 4.0 (April 2010) und 5.0 (August 2012) brachten im Gegensatz zu den vorherigen Versionsschritten nur wenige Neuerungen, darunter Dynamische Operationen (4.0), Optionale Parameter (4.0) und asynchrone Methoden (5.0). Zu jeder neuen Version von C# wird auch eine neue Version des.net Frameworks und von Visual Studio, der von Microsoft herausgegebenen C++/C# IDE, herausgegeben. 2.2 Vorgängersprachen Wenn man sich C# einmal anguckt erkennt man sehr deutlich die Ähnlichkeiten zu Java, weshalb C# in der Anfangszeit auch oft als Java-Klon bezeichnet wurde. Dennoch sieht Anders Heijlsberg eher C++ und damit auch C als direkter Vorgänger an, von denen die Syntax, viele Schlüsselwörter, Operatoren und das Objekt-Modell übernommen wurde. Java wird eher als entfernter Verwandter mit den gleichen Wurzeln angesehen. Zudem kamen mit fortschreitenden Versionen viele Neuerungen hinzu, die C# von Java weiter abgrenzen. Im allgemeinen ist C# so konzipiert das Java oder C++ Programmierer einen einfachen und schnellen Einstig haben. 2.3 Paradigmen C# ist eine Multi-Paradigmen Programmiersprache und unterstützt unter anderem Objektorientierte, imperative, generische und funktionale Programmierung. Das Objektmodell gleicht dem von C++ und Java. Objekte werden durch Klassen beschrieben. Diese haben Eigenschaften und bieten Methoden zur Veränderung dieser Eigenschaften an. Zugleich kann durch bestimmte Schlüsselwörter die Sichtbarkeit der Klasseninhalte beschränkt werden, um eine Kapselung der internen Daten zu erreichen. Anders als in C++ gibt es keine Mehrfachvererbung, allerdings gibt es dafür Interfaces wie in Java. C# unterstützt seit Version 2.0 auch die Generische Programmierung, die syntaktisch wie in Java benutzt wird, jedoch vom Compiler anders behandelt wird. Dazu folgt auch ein Beispiel im Kapitel Konzepte. Seit der Version 3.0 enthält C# auch funktionale Programmieraspekte, wie zum Beispiel Lambda Ausdrücke. Zudem ist C# natürlich auch eine imperative Sprache, in der der Programmablauf schrittweise im Quellcode festgelegt wird. 3

3 Das.NET-Framework Wie schon im vorherigen Kapitel erwähnt wurde C# ausschlieÿlich für das.net-framework konzipiert. Das.NET-Framework ist eine von Microsoft entwickelte Plattform für viele Programmiersprachen und primär zur Programmierung von Windows Anwendungen gedacht. Das Framework selbst ist zum gröÿten Teil in C# geschrieben. Die wichtigsten Komponenten von.net sind die Common Language Specication (CLS) das Common Type System (CTS) die Common Language Runtime (CLR) die.net-klassenbibliotheken diverse Compiler für die.net-sprachen Die Common Language Specication beschreibt dabei eine Reihe von Eigenschaften, die eine.net Sprache erfüllen muss. Das Common Type System deniert, welche Typen (Klassen, Interfaces und Datentypen) von der Common Language Runtime unterstützt werden. Früher musste man zum Beispiel aufpassen, wenn man mit Visual Basic eine C Bibliothek benutzen wollte, da diese unterschiedlich implementierte Datentypen haben..net-programmiersprachen können nun dank der CLS und der CTS in die Common Intermediate Language (CIL) übersetzt werden, ähnlich wie Java in Bytecode übersetzt wird. Das Prinzip wird nochmal in der Abbildung 3.1b veranschaulicht. Es gibt mittlerweile zu vielen Programmiersprachen eine.net Variante, manche können auch ohne Anpassungen kompiliert werden..net Programmiersprachen sind unter anderem C#, Visual C++, VB.NET, Eiel, Haskell, DotLisp oder Prolog.NET. Der generierte CIL- Code kann dann von der Common Language Runtime zur Laufzeit ausgeführt werden. Die Common Language Runtime, die Laufzeitumgebung des.net-frameworks, bietet zudem Garbage Collector, ClassLoader, Just-in-Time-Compiler und weiter Dienste an. Da nur der Just-in-Time(JIT)-Compiler hardwareabhängig ist, kann der Code theoretisch auf allen Plattformen, für die so ein JIT-Compiler existiert, ausgeführt werden. 4

3 Das.NET-Framework Praktisch gibt es jedoch das vollständige und aktuellste.net-framework nur von Microsoft auf Windows, da viele.net Bibliotheken speziell für Windows sind. Es gibt aber auch Projekte, die versuchen, zumindest Teile des.net Frameworks für verschiedenste Plattformen zu implementieren. Das wohl bekannteste und umfangreichste, das Mono Projekt wird im Kapitel technische Unterstützung vorgestellt. Mit Hilfe des.net Frameworks und C# können alle Arten von Windows Anwendungen geschrieben werden. Dazu stehen viele verschiedene Bibliotheken zu Verfügung, welche wir auf der Abbildung 3.1a sehen, wie zum Beispiel seit.net Version 2.0 die WinForms, ASP.NET und ADO.NET Bibliotheken. Diese gehören mittlerweile zu der Standard Bibliothek von.net und bieten Unterstützung zur GUI Programmierung (WinForms), Datenbankanbindung (ADO.NET) und Entwicklung Webbasierter Anwendungen (ASP.NET). Auch zum Beispiel Apps für Windows Phone und Windows 8 werden in C# geschrieben. (a) Das gesamte.net-framework (b) Das CLR-Prinzip 5

4 Technische Unterstützung Microsoft veröentlicht zu jeder neuen Version von C# und dem.net Framework eine neue Edition von Visual Studio. Visual Studio ist quasi die einzige existierende IDE zur Entwicklung von.net basierenden Windows Programmen. Sie beinhaltet unter anderem einen Code Editor mit Syntax-Highlighting und Code Vervollständigung, einen Debugger, verschiedene Designer und Anbindungen an Microsoft Serversysteme oder Datenbanken. Zudem kann Visual Studio durch verschiedenste Plug-ins erweitert werden. Von Haus aus enthalten sind Compiler für C#, Visual C++ und Visual Basic. Visual Studio ist generell kostenpichtig. Microsoft biete jedoch auch eine Express Version mit geringerem Umfang an, in der zum Beispiel keine Plug-ins unterstützt werden und keine x64 Compiler enthalten sind. Eine Alternative bietet zur Zeit nur das Mono Projekt, das versucht, eine Open-Source Version des.net-frameworks zu implementieren. Dieses bietet die IDE MonoDevelop, welche auf viele Plattformen, wie Windows, Mac und Linux, läuft. Das Mono Framework bietet jedoch noch nicht alle Funktionen, die das.net Framework zurzeit beinhaltet, deshalb kann man nicht immer ein C# Projekt ohne weiteres auf Mono portieren. Dies liegt daran, dass Microsoft viele Bibliotheken patentiert hat und diese bei Mono nun von Grund auf, und vor allem plattformunabhängig, selbst implementiert werden müssen. 6

5 Konzepte und Struktur Wie man in den folgenden Code Beispielen 5.1 und 5.2 sieht, ist die Struktur und Syntax von C# und Java nahezu identisch. 1 using System ; 2 class HelloWorld 3 { 4 static void Main () 5 { 6 Console. WriteLine (" Hello world!"); 7 } 8 } Code Beispiel 5.1: C-Sharp Hello World 1 class HelloWorld { 2 public static void main ( String [] args ) { 3 System. out. println (" Hello World!"); 4 } 5 } Code Beispiel 5.2: Java Hello World Klassen werden mit dem Schlüsselwort class deklariert und groÿ geschrieben, der Startpunkt eines Programms ist die Main Methode, Codeblöcke werden in geschweifte Klammern gefasst und Anweisungen werden mit einem Semikolon abgeschlossen. All das ist schon aus Java bekannt und wird deshalb in den folgenden Abschnitten als bekannt vorausgesetzt. Deshalb werden im nächsten Abschnitt nur kurz ein Paar Syntaktische Unterschiede zwischen C# und Java hervorgehoben, der gröÿte Teil dieses Kapitels widmet sich jedoch verschiedenen C# -Features. 7

5 Konzepte und Struktur 5.1 Sprachbeschreibung Die gängigsten Schlüsselwörter sind in C# und Java identisch. So gibt es die primitiven Datentypen char, int, float, Sichtbarkeitsmodikatoren wie public, private, protected oder Kontrollstrukturen wie if, while oder for. Kleine Unterschiede gibt es jedoch, zum Beispiel heiÿt der Boolean Datentyp wie in C++ bool und nicht wie in Java boolean, anstatt mit super() den Konstruktor der Oberklasse aufzurufen, geschieht dies mit base() und um externe Bibliotheken einzubinden, verwendet man using, nicht import. Primitive Datentypen in C# sind übrigens auch Objekte mit Methoden, das heiÿt eigentlich nicht primitiv. Dann gibt es natürlich noch Schlüsselwörter für Funktionen, die Java nicht unterstützt. Es können unter Anderem mit dem Schlüsselwort partial partielle Klassen erstellt werden. Damit kann der Quellcode einer Klasse auf verschiedene Dateien auf gesplittet werden. Dies wird zum Beispiel von Visual Studio benutzt, indem der vom Designer generierte Code vom Code des Entwicklers getrennt wird, um die Übersichtlichkeit zu steigern. Dazu müssen nur beide Klassen in der verschiedenen Dateien gleich heiÿen und als partial deklariert sein. Der Compiler fügt dann beide Klassenteile zu einer Klasse zusammen. Methoden sind in C#, anders als in Java, standardmäÿig non-virtual. Das heiÿt, dass Methoden in Elternklassen nicht einfach in deren Kindklassen überschrieben werden dürfen. Somit ist garantiert, dass nicht einfach eine neue Methode deniert werden kann, die sich eventuell nicht wie erwünscht verhält. Möchte man jedoch eine Methode überschreibbar machen, kann man das Schlüsselwort virtual benutzen. Überschreibende Methoden müssen dann das Schlüsselwort override verwenden. 8

5 Konzepte und Struktur 5.2 Konzepte 5.2.1 Operator Overloading In C# kann man, wie in C++, Operatoren überladen, dass heiÿt bekannte Operatoren wie +, - oder * für eigene Klassen zu implementieren, sodass diese inx benutzt werden können. Im folgenden Beispiel wird die Klasse MyComplex implementiert, welche eine Komplexe Zahl, bestehend aus Real und Imaginärteil, enthält. 1 using System ; 2 namespace test 3 { 4 public class MyComplex 5 { 6 private int real ; 7 private int imag ; 8 9 // Konstruktoren 10 // Getter und Setter 11 12 // Operator Overloading 13 public static MyComplex operator +( MyComplex myc1, 14 { MyComplex myc2 ) 15 MyComplex result = new MyComplex ( myc1. Real + myc2. Real, 16 return result ; 17 } myc1. Imag + myc2. Imag ); 18 // tostring mit Rueckgabe { real } + { imag } i 19 } 20 } Code Beispiel 5.3: Operator overloading Anders als in Java können wir eine Methode implementieren, die es uns ermöglicht, später MyComplex Objekte inx mit Hilfe des + Operators zu addieren. Die Methode muss dabei static deklariert sein, um den Operator später unabhängig von instantiierten MyComplex Objekten benutzen zu können. 9

5 Konzepte und Struktur Zudem muss das Schlüsselwort operator vor dem zu überladenen Symbol stehen. 1 using test ; 2 class OperatorTest 3 { 4 static void Main () 5 { 6 MyComplex myc1 = new MyComplex (1,1) ; 7 MyComplex myc2 = new MyComplex (1,1) ; 8 MyComplex result = myc1 + myc2 ; 9 System. Console. WriteLine ( result ); 10 } 11 } 12 // Ausgabe : 2 + 2 i Code Beispiel 5.4: Operator overloading Main Die dazugehörige Testklasse im obigen Beispiel 5.4 kann nun ganz einfach zwei MyComplex Objekte addieren. 5.2.2 Generics Generics wurden 2005 mit der C# Version 2.0 eingeführt. Die Syntax gleicht der von Java. 1 using System ; 2 3 class Gen <T > { 4 T ob ; 5 6 public Gen (T o) { 7 ob = o; 8 } 9 public void ShowType () { 10 Console. WriteLine (" Type of T is " + typeof (T)); 11 } 12 } Code Beispiel 5.5: Generics 10

5 Konzepte und Struktur Jedoch werden Generics in C# vom Compiler und der Common Language Runtime anders behandelt. In Java werden alle generischen Typen vom Compiler aufgelöst, die Java Virtual Machine hat kein Wissen über Generics. In C# sind Generics kein Sprach- sondern ein.net-feature und werden vom Compiler nur auf Korrektheit überprüft. Die Common Language Runtime löst diese dann Just in Time auf. 5.2.3 Reection Reection ist ein mächtiges Werkzeug in C#, mit deren Hilfe man zur Laufzeit alle Arten von Eigenschaften von Objekten herausnden kann. Dazu muss man wissen, dass wenn man ein C# Programm oder eine Bibliothek kompiliert, automatisch ein Assembly erzeugt wird. Dieses Assembly ist eine Datei, die das in Common Intermediate Language kompilierte Programm und zusätzliche Metadaten enthält. Ein Assembly besteht aus vier Teilen. Zum einem aus dem Manifest, das Daten über das Assembly selbst enthält, wie Name und Version. Dann gibt es den Abschnitt Metadaten, in dem Daten über die enthaltenen Klassen und Datentypen enthalten sind. Als Drittes folgt der Programmcode in Common Intermediate Language und zuletzt die benötigten Ressourcen. Assemblys können dynamisch zur Laufzeit geladen werden und mit Hilfe von Reection kann jetzt herausgefunden werden, welche Klassen in diesem Assembly enthalten sind und was deren Attribute und Methoden sind. Dazu ein sehr stark gekürztes Beispiel, das einige Methoden vorstellt : 1 using System ; 2 using. System. Reflection ; 3 class ReflectAssemblyDemo { 4 static void Main () { 5 // Assembly laden 6 Assembly asm = Assembly. LoadFrom (" Test. exe "); 7 8 // herausfinden was fuer Types Test. exe enthaelt 9 Type [] alltypes = asm. GetTypes () ; 10 11 Type t = alltypes [ 0]; 12 // bestimme die Konstruktoren des Types t 13 ConstructorInfo [] ci = t. GetConstructors () ; 14 15 11

5 Konzepte und Struktur 16 // konstruiere das Objekt mit Hilfe eines moeglichen Konstruktors, in unserem Fall dem Standardkonstruktor 17 object reflectob = ci [ 0]. Invoke () 18 19 // bestimme die Methoden von t 20 MethodInfo [] mi = t. GetMethods () ; 21 22 // benutze eine Methode des des Objektes mit den Parametern args 23 mi [0]. Invoke ( reflectob, args ); 24 } 25 } Code Beispiel 5.6: Reection Zunächst wird das Assembly geladen. Nun können wir die enthaltenen Types herausnden. Ein Type Objekt enthält alle Informationen über einen bestimmten Klassen-Typ. Mithilfe des Types können wir nun Namen und Parameter der Konstruktoren und Methoden herausnden. Nun kann ein Objekt erzeugt werden, das einer Klasse aus dem Assembly entspricht, ohne dass diese vorher bekannt war. 5.2.4 Anonyme Funktionen Anonyme Funktionen in C# sind unterteilt in anonyme Methoden und Lambda Ausdrücke. Anonyme Methoden werden mithilfe des Schlüsselwortes delegate erstellt. 1 using System ; 2 delegate void CountIt ( int end ); 3 class AnonMethodDemo { 4 static void Main () { 5 CountIt count = delegate ( int end ) { for ( int i =0; i <= end ;i ++) 6 Console. WriteLine (i); 7 }; 8 count (5) ; 9 } 10 } Code Beispiel 5.7: anonyme Methode 12

5 Konzepte und Struktur Ein delegate Objekt enthält eine Referenz auf eine Methode, vergleichbar mit Funktionspointern in C/C++. Ein delegate kann, wie im oberen Beispiel mit einer anonymen Methode instantiiert werden jedoch auch mit jeder Methode einer Instanz oder statischen Methode einer Klasse, solange die Signatur und der return Typ stimmt. Eine weitaus hübschere Art anonyme Methoden zu erstellen bieten sogenannte Lambda Ausdrücke. Diese benutzen den sogenannten Lambda Operator =>, der den Ausdruck zweiteilt. Auf der linken Seite werden die Eingabe Parameter speziziert und auf der rechen Seite ist der sogenannte Lambda Rumpf. Lambda Ausdrücke werden wiederum in zwei Arten unterteilt. Das eine sind die Ausdruckslambdas, deren Rumpf nur aus einem Ausdruck besteht. Also zum Beispiel : (x,y) => x==y. Diese Syntax ist vergleichbar mit der in Haskell wo der Lambda Ausdruck wie folgt aussehen würde : \x y -> x == y. Alle Lambda Ausdrücke die über mehrere Zeilen gehen werden mit geschweiften Klammern umschlossen und heiÿen Anweisungslambdas. Lambda Ausdrücke werden wie anonyme Methoden von delegates benutzt, bieten jedoch meistens eine hübschere Syntax. So können wir das delegate Beispiel wie folgt überarbeiten : 1 using System ; 2 delegate void CountIt ( int end ); 3 class AnonMethodLambdaDemo { 4 static void Main () { 5 CountIt count = end => { for ( int i =0; i <= end ;i ++) 6 Console. WriteLine (i); 7 }; 8 count (5) ; 9 } 10 } Code Beispiel 5.8: Lambda Ausdruck 13

5 Konzepte und Struktur 5.2.5 LINQ Language Integrated Query (LINQ) erweitert C# um die Möglichkeit SQL ähnliche Abfragen an verschiedenste Objekte zu stellen. Im folgenden sind dies Collections/Auflistungen, welche das IEnumerable-Interface implementieren. Dies nennt sich LINQ to Objects. Es gibt jedoch noch weiter LINQ Implementierungen, zum Beispiel LINQ to SQL (Zugri auf SQL Datenbanken), LINQ to XML (Zugri auf XML Strukturen) oder LINQ to DataSet. Mit der Einführung von LINQ gehen zweit weitere Neuerungen einher, nämlich anonyme Typen und Erweiterungsmethoden. Anonyme Typen sind vom Compiler automatisch erzeugte anonyme Klassen, die nur aus privaten Attribute und deren Gettern/Settern bestehen. Die Deklaration geschieht wie folgt : var person = new Vorname = "Max", Nachname = "Muster", Alter = 42 ; Zu dieser Deklaration existiert nur die deklarierten Instanz, welche ausschlieÿlich lokal benutzt werden kann. Gleich deklarierte anonyme Typen erkennt der Compiler und benutzt die zuvor erzeugte Klasse. Erweiterungsmethoden erlauben einem, Methoden einer vorhanden Klasse hinzuzufügen. Die Methoden werden als statische Methoden in einer neuen statischen Klasse implementiert und können dann wie eine normale Methode des erweiterten Datentyps aufgerufen werden. Eine Erweiterungsmethode ist so deklariert, dass vor dem ersten Parameter ein this steht und der Parameter vom Typ der zu erweiternden Klasse ist. Benutzt werden die Erweiterungsmethoden dann wie normale Methoden. Dies wird im Beipiel 5.9 verdeutlicht. Zuerst wird eine Klasse IntExtension deklariert, die die int Klasse um die Methode mult erweitert. Nun kann auf jeder int Variable die Methode.mult(int x) aufgerufen werden. Die LINQ Abfrageoperatoren sind als Erweiterungsmethoden deniert und auf Objekte, die das IEnumrable Interface implementieren, anwendbar. 1 public static class IntExtension { 2 3 public static int mult [ this int instanz, int faktor ) { 4 return instanz * faktor ; 5 } 6 } 7 /* Benutzung : 8 * int zahl = 42; 9 * int ergebnis = zahl. mult (2) ; //82 10 */ Code Beispiel 5.9: Erweiterungsmethode 14

5 Konzepte und Struktur LINQ ermöglicht es jetzt, Abfragen an Objekte zu stellen zu stellen. Dazu gibt es zum einen die Abfrage-Syntax, welche sehr an SQL erinnert und zum anderen die Erweiterungsmethoden-Syntax, welche Erweiterungsmethoden und Lambda Ausdrücke benutzt. Die Abfrage-Syntax ist zugunsten besserer Lesbarkeit zu bevorzugen, wir jedoch im Endeekt vom Compiler auch in eine Erweiterungsmethoden-Syntax übersetzt. 1 using System ; 2 using System. Linq ; 3 public class LINQDemo { 4 5 string [] monate = {" Januar "," Februar "," Maerz "," April "," Mai " 6," Juni "," Juli "," August "," September "," Oktober "," November "," Dezember " }; 7 // Abfrage - Syntax 8 var expr = from s in monate 9 where s. Length == 6 10 orderby s 11 select s. ToUpper () ; 12 13 // Erweiterungsmethoden - Syntax 14 var expr = monate. where (s => s. Length == 6). OrderBy (s => s) 15 }. Select ( s => s. ToUpper () ); Code Beispiel 5.10: LINQ Abfragen in Abfragen-Syntax fangen grundsätzlich mit from an. Das from iteriert dann über eine Liste von Daten, im obigen Beispiel über monate. Als nächstes folgen bekannte SQL Operatoren wie where zur Filterung, orderby zur Sortierung, groupby zur Gruppierung und zum Schluss das select zur Auswahl oder Projektion der abgefragten Elemente. 15

6 Zusammenfassung und Fazit Alles in allem muss man sagen, dass C# nicht einfach nur irgendein Java Klon ist. C# ist ein von Microsoft an seine Bedürfnisse angepasste Sprache, die ihre Funktion erfüllt, nämlich mit dem.net Framework zusammen zu arbeiten, und zudem simpel und einfach zu verstehen ist. Da Java bekannt und denitiv einfacher als C++ war, wurde eben sehr viel Syntax übernommen. Es gibt jedoch viele praktische Eigenschaften, wie LINQ oder Reection, die C# zu einer mächtigen Sprache machen und diese Arbeit kann leider nur einen groben Überblick geben, was alles mit C# möglich ist. Leider gibt es das komplette.net Framework zurzeit nur unter Windows, was die Benutzung von C# wohl auch nur für Windows Entwickler interessant macht. Eine Honung bleibt das Mono Projekt, das eine plattformunabhängige Open-Source Alternative zum.net Framework bietet, jedoch noch nicht alle Funktionen unterstützt. C# an sich ist aber eine schöne, für mich als Java Kenner, intuitiv erlernbare Sprache, die viele wichtige Programmierparadigmen unterstützt und deshalb gut und vielseitig zu benutzen ist. 16

Literaturverzeichnis [DG09] Doberenz, Walter ; Gewinnus, Thomas: Der Visual-C# -Programmierer - Visual C# lernen : professionell anwenden ; Lösungen nutzen. München, Wien : Carl Hanser, 2009. ISBN 9783446420212 [Sch08] Schildt, Herbert: C# 3.0 THE COMPLETE REFERENCE 3/E -. Madison : McGraw Hill Professional, 2008. ISBN 9780071588416 [Sch10] Schulten, Lars: Was ist neu in C# 4.0? 2010 [Tan12] Tang, Fahao: An Introduction to New Features in C# 5.0. 2012 [Wik12a] Wikipedia: C-Sharp Wikipedia, Die freie Enzyklopädie. 2012 [Wik12b] Wikipedia: Liste von.net-sprachen Wikipedia, Die freie Enzyklopädie. 2012 [Wik13a] Wikipedia: Microsoft Visual Studio Wikipedia, The Free Encyclopedia. 2013 [Wik13b] Wikipedia: Mono (software) Wikipedia, The Free Encyclopedia. 2013 17