19

C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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

Page 2: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 Re�ection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

5.2.4 Anonyme Funktionen . . . . . . . . . . . . . . . . . . . . . . . . . 12

5.2.5 LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

6 Zusammenfassung und Fazit 16

ii

Page 3: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

1 Einleitung

C# hat es in kürzester Zeit gescha�t, eine der weltweit meist benutzten Programmierspra-

chen zu werden. Doch wieso eigentlich? Nun zum einem, weil Microsoft es so wollte. C#

wurde gescha�en um Software für Windows zu schreiben und alle, die das machen, wer-

den 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

Page 4: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 Entwick-

lungsteams 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

Page 5: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

2 Einordnung

Neuerungen, wie zum Beispiel Lambda Ausdrücke und LINQ (Language-integrated que-

ry) 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 vorheri-

gen 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 Objekt-

orientierte, 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

Page 6: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 ge-

dacht. Das Framework selbst ist zum gröÿten Teil in C# geschrieben.

Die wichtigsten Komponenten von .NET sind

• die Common Language Speci�cation (CLS)

• das Common Type System (CTS)

• die Common Language Runtime (CLR)

• die .NET-Klassenbibliotheken

• diverse Compiler für die .NET-Sprachen

Die Common Language Speci�cation beschreibt dabei eine Reihe von Eigenschaften, die

eine .NET Sprache erfüllen muss. Das Common Type System de�niert, 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 mitt-

lerweile zu vielen Programmiersprachen eine .NET Variante, manche können auch ohne

Anpassungen kompiliert werden. .NET Programmiersprachen sind unter anderem C# ,

Visual C++, VB.NET, Ei�el, 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 theore-

tisch auf allen Plattformen, für die so ein JIT-Compiler existiert, ausgeführt werden.

4

Page 7: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

3 Das .NET-Framework

Praktisch gibt es jedoch das vollständige und aktuellste .NET-Framework nur von Mi-

crosoft 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 verschie-

denste 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 Ab-

bildung 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), Datenbankan-

bindung (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

Page 8: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 kostenp�ichtig. 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

Page 9: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 Start-

punkt eines Programms ist die Main Methode, Codeblöcke werden in geschweifte Klam-

mern 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 wid-

met sich jedoch verschiedenen C# -Features.

7

Page 10: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

5 Konzepte und Struktur

5.1 Sprachbeschreibung

Die gängigsten Schlüsselwörter sind in C# und Java identisch. So gibt es die primi-

tiven Datentypen char, int, float, Sichtbarkeitsmodi�katoren 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 Funk-

tionen, 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 ver-

schiedenen 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 de�niert 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

Page 11: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 in�x 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 ,

MyComplex myc2)

14 {

15 MyComplex result = new MyComplex(myc1.Real + myc2.Real ,

myc1.Imag + myc2.Imag);

16 return result;

17 }

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 in�x 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

Page 12: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 + 2i

Code Beispiel 5.4: Operator overloading Main

Die dazugehörige Testklasse im obigen Beispiel 5.4 kann nun ganz einfach zwei MyCom-

plex 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

Page 13: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 Re�ection

Re�ection ist ein mächtiges Werkzeug in C# , mit deren Hilfe man zur Laufzeit alle

Arten von Eigenschaften von Objekten heraus�nden 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 Langua-

ge 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 Re�ection kann jetzt

herausgefunden werden, welche Klassen in diesem Assembly enthalten sind und was de-

ren 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

Page 14: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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: Re�ection

Zunächst wird das Assembly geladen. Nun können wir die enthaltenen Types heraus�n-

den. 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 Me-

thoden heraus�nden. 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 Aus-

drü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

Page 15: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

5 Konzepte und Struktur

Ein delegate Objekt enthält eine Referenz auf eine Methode, vergleichbar mit Funkti-

onspointern 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üb-

schere 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 spezi�ziert und auf der rechen Seite ist der

sogenannte Lambda Rumpf. Lambda Ausdrücke werden wiederum in zwei Arten unter-

teilt. 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 Aus-

drü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 de-

legate 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

Page 16: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

5 Konzepte und Struktur

5.2.5 LINQ

Language Integrated Query (LINQ) erweitert C# um die Möglichkeit SQL ähnliche Ab-

fragen an verschiedenste Objekte zu stellen. Im folgenden sind dies Collections/Auf-

listungen, 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 Com-

piler 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 be-

nutzt die zuvor erzeugte Klasse. Erweiterungsmethoden erlauben einem, Methoden einer

vorhanden Klasse hinzuzufügen. Die Methoden werden als statische Methoden in ei-

ner neuen statischen Klasse implementiert und können dann wie eine normale Methode

des erweiterten Datentyps aufgerufen werden. Eine Erweiterungsmethode ist so dekla-

riert, 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 IntExtensi-

on 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 de�niert 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

Page 17: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 Erweiterungs-

methoden-Syntax, welche Erweiterungsmethoden und Lambda Ausdrücke benutzt. Die

Abfrage-Syntax ist zugunsten besserer Lesbarkeit zu bevorzugen, wir jedoch im Ende�ekt

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"

,"Juni","Juli","August","September","Oktober","November"

,"Dezember"};

6

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)

.Select( s => s.ToUpper ());

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 be-

kannte 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

Page 18: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 de�nitiv einfacher als C++ war, wurde eben sehr

viel Syntax übernommen. Es gibt jedoch viele praktische Eigenschaften, wie LINQ oder

Re�ection, 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 Ho�nung 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

Page 19: C - Die .NET Sprache - informatik.uni-kiel.de · C # wird auch eine neue ersionV des .NET ramewForks und von Visual Studio, der von Microsoft herausgegebenen C++/C # IDE, herausgegeben

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 978�3�446�42021�2

[Sch08] Schildt, Herbert: C# 3.0 THE COMPLETE REFERENCE 3/E -. Madison

: McGraw Hill Professional, 2008. � ISBN 978�0�071�58841�6

[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