C# - Die .NET Sprache - AG Programmiersprachen und

Werbung
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
Herunterladen