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 5.2.5 LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 6 . . . . . . . . . . . . . . . . . . . . . . . . . 12 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 Kapi- tel 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 CILCode 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 wer- den. 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. (b) Das CLR-Prinzip (a) Das gesamte .NET-Framework 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 2 3 4 5 6 7 8 using System ; class HelloWorld { static void Main () { Console . WriteLine (" Hello world !") ; } } Code Beispiel 5.1: C-Sharp Hello World 1 2 3 4 5 class HelloWorld { public static void main ( String [] args ) { System . out . println (" Hello World !") ; } } 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 2 3 4 5 6 7 using System ; namespace test { public class MyComplex { private int real ; private int imag ; 8 // Konstruktoren // Getter und Setter 9 10 11 // Operator Overloading public static MyComplex operator +( MyComplex myc1 , MyComplex myc2 ) { MyComplex result = new MyComplex ( myc1 . Real + myc2 . Real , myc1 . Imag + myc2 . Imag ) ; return result ; } // toString mit Rueckgabe { real } + { imag } i 12 13 14 15 16 17 18 } 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 2 3 4 5 6 7 8 9 10 11 12 using test ; class OperatorTest { static void Main () { MyComplex myc1 = new MyComplex (1 ,1) ; MyComplex myc2 = new MyComplex (1 ,1) ; MyComplex result = myc1 + myc2 ; System . Console . WriteLine ( result ); } } // Ausgabe : 2 + 2i 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 class Gen <T > { 4 T ob ; 3 5 public Gen (T o) { ob = o; } public void ShowType () { Console . WriteLine (" Type of T is " + typeof ( T)) ; } 6 7 8 9 10 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 2 3 4 5 6 using System ; using . System . Reflection ; class ReflectAssemblyDemo { static void Main () { // Assembly laden Assembly asm = Assembly . LoadFrom ( " Test . exe "); 7 8 9 // herausfinden was fuer Types Test . exe enthaelt Type [] allTypes = asm . GetTypes () ; 10 11 12 13 Type t = allTypes [0]; // bestimme die Konstruktoren des Types t ConstructorInfo [] ci = t. GetConstructors () ; 14 15 11 5 Konzepte und Struktur // konstruiere das Objekt mit Hilfe eines moeglichen Konstruktors , in unserem Fall dem Standardkonstruktor object reflectOb = ci [0]. Invoke () 16 17 18 // bestimme die Methoden von t MethodInfo [] mi = t. GetMethods () ; 19 20 21 // benutze eine Methode des des Objektes mit den Parametern args mi [0]. Invoke ( reflectOb , args ); 22 23 } 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 2 3 4 5 6 7 8 9 10 using System ; delegate void CountIt ( int end ) ; class AnonMethodDemo { static void Main () { CountIt count = delegate ( int end ) { for ( int i =0; i <= end ;i ++) Console . WriteLine (i) ; }; count (5) ; } } 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 2 3 4 5 6 7 8 9 10 using System ; delegate void CountIt ( int end ) ; class AnonMethodLambdaDemo { static void Main () { CountIt count = end => { for ( int i =0; i <= end ; i ++) Console . WriteLine (i) ; }; count (5) ; } } 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 4 5 6 7 8 9 10 public static int mult [ this int instanz , int faktor ) { return instanz * faktor ; } } /* Benutzung : * int zahl = 42; * int ergebnis = zahl . mult (2) ; //82 */ 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. using System ; 2 using System . Linq ; 3 public class LINQDemo { 1 4 string [] monate = { " Januar " ," Februar " ," Maerz " ," April " ," Mai " ," Juni " ," Juli " ," August " ," September " ," Oktober " ," November " ," Dezember " }; 5 6 // Abfrage - Syntax var expr = from s in monate where s . Length == 6 orderby s select s. ToUpper () ; 7 8 9 10 11 12 // Erweiterungsmethoden - Syntax var expr = monate . where (s => s . Length == 6) . OrderBy (s => s) . Select ( s => s. ToUpper () ) ; 13 14 15 } 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] Der Visual-C# -Programmierer Visual C# lernen : professionell anwenden ; Lösungen nutzen. München, Wien Doberenz, Walter ; Gewinnus, Thomas: : Carl Hanser, 2009. ISBN 9783446420212 [Sch08] Schildt, Herbert: C# 3.0 THE COMPLETE REFERENCE 3/E -. Madison : McGraw Hill Professional, 2008. ISBN 9780071588416 [Sch10] [Tan12] [Wik12a] [Wik12b] Schulten, Lars: Was ist neu in C# 4.0? 2010 Tang, Fahao: An Introduction to New Features in C# 5.0. 2012 Wikipedia: C-Sharp Wikipedia, Die freie Enzyklopädie. 2012 Wikipedia: Liste von .NET-Sprachen Wikipedia, Die freie Enzyklopädie. 2012 [Wik13a] Wikipedia: 2013 [Wik13b] Microsoft Visual Studio Wikipedia, The Free Encyclopedia. Wikipedia: Mono (software) Wikipedia, The Free Encyclopedia. 2013 17