Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

Save this PDF as:
 WORD  PNG  TXT  JPG

Größe: px
Ab Seite anzeigen:

Download "Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net"

Transkript

1 Jürgen Bayer Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

2 Inhaltsverzeichnis 1 Einleitung 1 2 Anonyme Methoden 2 3 Lambda-Ausdrücke 4 4 Ausdrucksbäume Was sind Ausdrucksbäume? Der Sinn von Ausdrucksbäumen Ausdrucksbäume in.net Erstellung eines Ausdrucksbaums 8

3 1 Einleitung Das.NET-Framework enthält mit anonymen Methoden, Lambda-Ausdrücken und Ausdrucksbäumen wichtige Features der funktionalen Programmierung. Um dieses interessante Konzept (das ich hier nicht weiter ausführe) zu verstehen oder auch umsetzen zu können, und um mit modernen.net-features wie LINQ arbeiten zu können, sollten Sie sich mit diesen Themen auskennen. Da ich denke, dass das Verständnis besonders von Ausdrucksbäumen sehr wichtig ist, behandle ich diese zwar eher theoretisch, aber so umfangreich, dass Sie später wissen, wie z. B. LINQ to SQL einen Lambda-Ausdruck in eine SQL-Anweisung umsetzt. Einleitung 1

4 2 Anonyme Methoden Anonyme Methoden sind Methoden, die nur über einen Delegaten referenziert werden. Sie besitzen keinen Namen und können deswegen auch nicht über diesen aufgerufen werden. Eine Anonyme Methode kann (auf die alte Art) über das delagate-schlüsselwort erzeugt werden. Die Syntax dazu ist: delegate([argumentliste]) Anweisungsblock Das Ganze wird einfacher in einem Beispiel. Dieses Beispiel demonstriert auch gleich den wesentlichen Aspekt der funktionalen Programmierung. Lassen Sie es auf sich wirken. Angenommen, eine Methode erwartet ein Array aus Integerwerten und einen Delegaten auf eine Methode, die für alle Elemente des Arrays aufgerufen wird: private static void TestValuesForCondition(int[] values, Func<int, bool> testmethod) foreach (var value in values) if (testmethod(value) == true) Console.WriteLine("Der Wert " + value + " wurde bestätigt"); Listing 2.1: Methode, die Integer-Werte auf eine Bedingung testet, die in Form eines Delegaten übergeben wird Der Delegat für die Testmethode entspricht in diesem Beispiel dem generischen Delegaten System.Func mit einem int-argument und bool als Rückgabetyp. In der Anwendung könnten Sie nun die Testmethode mit einem Integer-Array und einer anonymen Methode aufrufen, die die Werte daraufhin überprüft, ob diese gerade sind: // Erzeugen des Beispiel-Arrays int[] testvalues = new int[10]; Random random = new Random(); for (int i = 0; i < 10; i++) testvalues[i] = random.next(1, 100); // Aufruf der Testmethode mit einer anonymen Methode, // die die Werte daraufhin überprüft, ob diese // gerade sind Console.WriteLine("Gerade Zahlen: "); TestValuesForCondition(testValues, delegate(int value) return value % 2 == 0; ); Console.WriteLine(); Listing 2.2: Verwendung einer anonymen Methode als Argument einer Methode Was Sie jetzt einsetzen, ist funktionale Programmierung. In diesem Beispiel wird die Bedingung, die dazu führt, dass ein Integer-Wert bestätigt wird, über eine Funktion (eigentlich ja Methode ) definiert, die beim Aufruf der Testmethode übergeben wird. Die Funktion bestimmt die Regeln. Das macht dieses Konzept sehr mächtig. Die übergebene (oder sonst wie verwendete) Funktion kann schließlich unendlich vielfältig programmiert werden. So ist z. B. auch eine Prüfung auf ungerade oder Primzahlen auf eine ziemlich direkte Weise möglich ohne die Testmethode umschreiben zu müssen: Anonyme Methoden 2

5 // Aufruf der Testmethode mit einer anonymen Methode, // die die Werte daraufhin überprüft, ob diese // ungerade sind Console.WriteLine("Ungerade Zahlen: "); TestValuesForCondition(testValues, delegate(int value) return value % 2!= 0; ); Console.WriteLine(); // Aufruf der Testmethode mit einer anonymen Methode, // die die Werte daraufhin überprüft, ob Primzahlen sind Console.WriteLine("Primzahlen: "); TestValuesForCondition(testValues, delegate(int value) if (value < 3) return false; for (int divisor = 2; divisor < value; divisor++) if (value % divisor == 0) return false; return true; ); Listing 2.3: Weiterer Einsatz anonymer Methoden in der funktionalen Programmierung Statt der anonymen Methoden könnten Sie natürlich auch»richtige«methoden übergeben. Diese müssten dann aber deklariert werden, was recht aufwändig wäre. Eine anonyme Methode ist, besonders in Form eines Lambda-Ausdrucks (der im nächsten Abschnitt behandelt wird) wesentlich einfacher zu erzeugen. Einfache anonyme Methoden besitzen zudem den Vorteil, dass an der Stelle des Aufrufs sehr schnell erkannt werden kann, was dort passiert. Ich würde anonyme Methoden auch nur dann einsetzen, wenn diese relativ einfach oder bei komplexen Methoden wenn die Programmlogik nicht an mehreren Stellen verwendet wird. Die im Beispiel verwendete anonyme Methode zur Ermittlung, ob eine Zahl eine Primzahl ist, ist ein Grenzfall, da der Programmcode auf jeden Fall noch verbessert werden könnte. Würde diese Methode mehrfach benötigt, würde ich dazu eher eine echte Methode schreiben, die dann am testmethod-argument der Testmethode (in Form einer Instanz von Func<int, bool>) übergeben wird. Anonyme Methoden 3

6 3 Lambda-Ausdrücke Lambda-Ausdrücke sind ein neues Feature von C# 3.0 bzw. des.net-framework 3.5. Lambda- Ausdrücke werden sehr intensiv mit LINQ eingesetzt, können aber (wie in dem Beispiel dieses Abschnitts) auch für eigene (funktionale) Programmierung verwendet werden. Ein Lambda-Ausdruck ist ein Ausdruck, der zum einen in einen in einen sogenannten Ausdrucksbaum konvertiert werden kann. Ausdrucksbäume werden in Kapitel 4 behandelt. Lambda-Ausdrücke können zum anderen aber auch in einen Delegaten konvertiert werden. Dieser Delegat referenziert eine anonyme Methode, die implizit über den Lambda-Ausdruck erzeugt wird, sobald dieser als Delegat verwendet wird. C# 3.0 bietet eine spezielle Syntax zur Erzeugung eines Lambda-Ausdrucks. Dazu werden eventuelle Argumente der Methode vor dem Operator => angegeben. Rechts davon stehen dann die Anweisungen, die die Methode ausmachen: [Argumentliste] => Ausdruck Anweisungsblock In der Argumentliste geben Sie alle Argumente an, die in der Methode verwendet werden. Besitzt die Methode keine Argumente, wird natürlich auch keine Argumentliste angegeben. Ist keines oder mehr als ein Argument vorhanden, muss die Argumentliste in Klammern angegeben werden. Ist nur ein Argument vorhanden, können Sie die Klammern weglassen. Sie können die Argumente ohne Typ angeben, dann entspricht der Typ des Arguments dem des entsprechenden Arguments des Delegaten, dem Sie den Lambda-Ausdruck zuweisen. In den wenigen Fällen, in denen Sie einen anderen Typ angeben müssen, können Sie den Typ wie bei Variablen vor das Argument schreiben. Rechts vom Lambda-Operator steht dann entweder ein Ausdruck oder ein Anweisungsblock. Ausdrücke werden direkt angegeben. Die Rückgabe des Lambda-Ausdrucks entspricht dann dem Ergebnis des Ausdrucks. Listing 3.1 zeigt einige Beispiele für Lambda-Ausdrücke, die mit Ausdrücken arbeiten. Um das Ganze kompilieren zu können, weist das Beispiel die erzeugten Lambda-Ausdrücke Variablen zu, deren Typ ein Delegat ist, der dem Lambda-Ausdruck entspricht. // Lambda-Ausdruck mit Ausdruck ohne Parameter Func<int> f1 = () => 1 + 1; // Lambda-Ausdruck mit Ausdruck mit einem implizit typisierten Parameter Func<int, int> f2 = x => x + 1; // Lambda-Ausdruck mit Ausdruck und zwei explizit typisierten Parametern Func<int, int, int> f3 = (int x, int y) => x + y; Listing 3.1: Beispiele für Lambda-Ausdrücke, die mit Ausdrücken arbeiten Lambda-Ausdrücke 4

7 Werden Anweisungsblöcke verwendet, müssen diese immer in geschweifte Klammern eingetragen werden, auch wenn es sich nur um eine Anweisung handelt. Soll (bzw. muss) der Lambda-Ausdruck einen Wert zurückgeben, muss dieser wie bei einer normalen Methode über return zurückgegeben werden. Func<int, int> f4 = (x) => if (x < 10) return 1; else if (x < 100) return 2; else return 3; ; Listing 3.2: Lambda-Ausdruck mit Anweisungsblock Mit diesem Wissen können wir die Testmethoden aus dem Beispiel des vorhergehenden Abschnitts einfacher darstellen als mit anonymen Methoden: // Aufruf der Testmethode mit einem Lambda-Ausdruck, // der die Werte daraufhin überprüft, ob diese gerade sind Console.WriteLine("Gerade Zahlen: "); TestValuesForCondition(testValues, value => value % 2 == 0); Console.WriteLine(); // Aufruf der Testmethode mit einem Lambda-Ausdruck, // der die Werte daraufhin überprüft, ob diese ungerade sind Console.WriteLine("Ungerade Zahlen: "); TestValuesForCondition(testValues, value => value % 2!= 0 ); Console.WriteLine(); // Aufruf der Testmethode mit einem Lambda-Ausdruck, // der die Werte daraufhin überprüft, ob Primzahlen sind Console.WriteLine("Primzahlen: "); TestValuesForCondition(testValues, value => if (value < 3) return false; for (int divisor = 2; divisor < value; divisor++) if (value % divisor == 0) return false; return true; ); Console.WriteLine(); Listing 3.3: Funktionale Programmierung mit Lambda-Ausdrücken Beachten Sie, dass die Lambda-Ausdrücke in den Beispielen einem Delegat-Argument zugewiesen werden. Deswegen werden die Lambda-Ausdrücke implizit in eine anonyme Methode konvertiert, die über den Delgat aufgerufen werden kann. Besonders die einfachen Ausdrücke zeigen, dass Lambda-Ausdrücke wesentlich einfacher zu implementieren sind als anonyme Methoden. Und wenn Sie sich einmal daran gewöhnt haben, sind diese auch einfacher zu lesen. Bald. Versprochen. Lambda-Ausdrücke 5

8 4 Ausdrucksbäume Ausdrucksbäume (Expression Trees) sind ein neues Feature im.net-framework 3.5, allerdings keine neues Feature in der allgemeinen Informatik. Das Prinzip von Ausdrucksbäumen ist in der Informatik (bzw. in der Mathematik) schon seit längerem bekannt. 4.1 Was sind Ausdrucksbäume? Über Ausdrucksbäume können Ausdrücke dargestellt bzw. gespeichert werden. Der folgende Ausdruck zur Berechnung eines Bruttowerts: net * (1 + (vat / 100)) kann z. B. wie in Abbildung 4.1 in einem Ausdrucksbaum dargestellt werden. Abbildung 4.1: Ein Ausdrucksbaum zur Berechnung eines Bruttobetrags Der Baum im Beispiel besteht aus drei Berechnungs-Ausdrücken (Multiplikation, Addition und Division), zwei konstanten Ausdrücken für die in der Berechnung verwendeten Konstanten 1 und 100 und zwei Parameterausdrücken für die Parameter net und vat. Bei der späteren Berechnung werden die Parameterausdrücke mit Werten versehen. Jeder Baum beginnt bei einem Wurzelausdruck. Im Beispiel ist das der Multiplikationsausdruck. Die Berechnungs-Ausdrücke im Beispiel besitzen einen linken und einen rechten Operanden. Der linke Operand des Multiplikationsausdrucks ist der Parameterausdruck für den Parameter net, der rechte der Additionssausdruck. Der linke Operand des Additionsausdrucks ist der Konstantenausdruck für den Wert 1, der rechte der Divisionsausdruck. Etc. Ein Ausdrucksbaums wird ausgehend vom Wurzelknoten ausgewertet. Dabei werden zuerst die Knoten an den Enden ausgerechnet, dann die darüberliegenden etc. Im Beispiel ergäbe das die folgenden (mathematisch korrekten) Einzelschritte: Zwischenergebnis1 = vat / 100 Ausdrucksbäume 6

9 Zwischenergebnis2 = 1 + Zwischenergebnis1 Endergebnis = net * Zwischenergebnis2 Die Parameter müssen für die Berechnung natürlich mit Werten versehen werden. 4.2 Der Sinn von Ausdrucksbäumen Mit Ausdrucksbäumen können beliebige Ausdrücke in einem Programm gespeichert und ausgewertet werden. Das ist noch nichts Besonderes, weil Sie Ausdrücke ja auch direkt in Programmen verwenden können. Ausdrucksbäume erlauben aber zum einen das dynamische Zusammensetzen eines Ausdrucks und zum anderen spezielle Auswertungen eines Ausdrucks. Das dynamische Zusammensetzen eines Ausdrucks wird z. B. in Ausdrucksparsern benötigt, die eine Benutzereingabe in einen auswertbaren Ausdruck umwandeln. Stellen Sie sich vor, Sie müssten eine einfache Anwendung schreiben, in die der Anwender einen mathematischen Ausdruck eingeben kann, der danach ausgewertet werden soll. Wenn Sie die Eingabe parsen, müssen Sie die einzelnen Teile des Gesamtausdrucks so speichern, dass Sie diese später auswerten können. Ein Ausdrucksbaum ist dafür ideal geeignet. Sie bräuchten lediglich Klassen, die die unterstützten atomaren Ausdrücke (Addition, Subtraktion, Multiplikation etc.) abbilden und die Referenzen auf ihre Operanden(ausdrücke) erlauben. Das.NET-Framework stellt dazu im Namensraum System.Linq.Expressions entsprechende Klassen zur Verfügung, gemeinsam mit der Möglichkeit, einen Ausdruck dynamisch auszuführen. Sie müssten»nur«noch den Parser schreiben (was allerdings nicht allzu einfach ist). Neben dem dynamischen Zusammensetzen und dem Ausführen eines Ausdrucks erlauben Ausdrucksbäume auch eine dynamische Auswertung. Dieses Feature wird z. B. in LINQ to SQL genutzt: LINQ erlaubt zunächst die Verwendung der Where-Methode auf allen Auflistungen, die IEnumerable implementieren. Dieser Methode wird eine Instanz des Delegate Func<TSource, bool> oder Func<TSource, int, bool> übergeben, wobei TSource der Typ der in der Auflistung verwalteten Objekte und bool der Rückgabetyp ist. Die übergebene Methode überprüft eine Bedingung über die Auswertung des übergebenen Objekts und gibt true zurück, wenn die Bedingung erfüllt ist. Dazu wird natürlich zur Vereinfachung ein Lambda-Ausdruck verwendet. Das folgende Beispiel sucht in einer Auflistung von Personen nach denen, die in Dublin wohnen: List<Person> persons = GetPersons(); foreach (Person personfromdublin in persons.where<person>( person => person.city == "Dublin")) Console.WriteLine(personFromDublin.FirstName + " " + personfromdublin.lastname); LINQ verwendet die übergebene Prüf-Methode zum Test, ob die einzelnen Objekte in der Auflistung der Bedingung entsprechen. Das hat noch nichts mit Ausdrucksbäumen zu tun. Wird aber LINQ to SQL verwendet, sieht das Ganze anders aus. Die Abfrage der Daten erfolgt dann gegen eine Auflistung, die in einem DataContext verwaltet wird. Ich will hier nicht näher auf dieses separate Thema eingehen. Der DataContext kümmert sich im Wesentlichen um die Abfrage und Aktualisierung der Daten. Eine zum vorhergehenden Beispiel äquivalente Abfrage würde in etwa folgendermaßen aussehen: foreach (Person personfromdublin in datacontext.persons.where<person>( person => person.city == "Dublin")) Console.WriteLine(personFromDublin.FirstName + " " + personfromdublin.lastname); Würden bei LINQ to SQL allerdings zunächst immer erst alle Objekte aus der Datenquelle abgefragt und dann erst gegen die Prüfmethode geprüft werden, wäre dies sehr ineffizient. Ausdrucksbäume 7

10 Deswegen geht LINQ to SQL anders vor: Die Where-Methode wertet den Ausdrucksbaum aus, den der übergebene Lambda-Ausdruck ergibt, und setzt diesen in eine entsprechende SQL- WHERE-Klausel um. Diese wird dann verwendet, um die Daten gezielt abzufragen. Damit werden nur die Daten abgefragt, die der übergebenen Bedingung entsprechen. Das ist effizient und damit ein guter Grund für den Einsatz von Ausdrucksbäumen. 4.3 Ausdrucksbäume in.net Das.NET-Framework unterstützt Ausdrucksbäume über Klassen im Namensraum System.Linq.Expressions. Der Namensraum deutet darauf hin, dass Ausdrucksbäume vorwiegend in LINQ verwendet werden, was auch richtig ist. Ausdrucksbäume können allerdings (natürlich) überall dort verwendet werden, wo sie sinnvoll erscheinen. Anwendungsbereiche zu finden ist allerdings nicht allzu einfach wenn Sie in der»normalen«( objektorientierten) Programmierung zuhause sind, um nicht in der funktionalen. LINQ to SQL nutzt Ausdrucksbäume sehr intensiv, indem die bei der Abfrage von Daten verwendeten Lambda-Ausdrücke in passende SQL-Anweisungen umgesetzt werden. Das Verständnis dieser Technik war der Hauptgrund dafür, Ausdrucksbäume in diesem Artikel zu behandeln. Aber vielleicht finden Sie auch weitere Verwendung dafür. 4.4 Erstellung eines Ausdrucksbaums Ein Lambda-Ausdruck, der einem Delegate D entspricht, entspricht immer einer Instanz der Klasse System.Linq.Expressions.Expression<D>. Ausdruckbäume können also implizit über einen Lambda-Ausdruck erzeugt werden (was ja z. B. bei LINQ to SQL genutzt wird). Die Bruttoberechnung kann z. B. folgendermaßen über einen Lambda-Ausdruck erzeugt werden: Expression<Func<double, double, double>> grosslambdaexpression = (net, vat) => net * (1 + (vat / 100)); Sie können Ausdrucksbäume aber auch explizit über die Klassen des Namensraums System.Linq.Expressions erzeugen. Das erscheint Ihnen vielleicht etwas komplex und u. U. unsinnig. Wie gesagt: Anwendungsbereiche dafür zu finden ist nicht so einfach. Aber ich denke, um die Möglichkeiten einschätzen zu können, sollten wir mit Ausdrucksbäumen umgehen können. Ausdrucksbäume 8

11 System.Linq.Expressions enthält einige Klassen zur Definition von Ausdrücken (Tabelle 4.1). Expression ist dabei die (abstrakte) Basisklasse aller Ausdrucksklassen. Die spezialisierten Ausdrucksklassen wie z. B. BinaryExpression können nicht direkt instanziert werden, sondern müssen über statische Methoden der Expression-Klasse erzeugt werden. Klasse Expression Expression<TDelegate> BinaryExpression ConditionalExpression ConstantExpression LambdaExpression MethodCallExpression Bedeutung Expression ist die abstrakte Basisklasse aller speziellen Ausdrucksklassen. Sie stellt die Eigenschaft NodeType zur Verfügung, die den Typ des Knotens definiert, den der jeweilige Ausdruck darstellt. Die Eigenschaft Type gibt den Typ des Ausdrucks an. Expression enthält außerdem eine Menge statischer Methoden zur Erzeugung spezialisierter Ausdruck-Objekte, wie z. B. Add zur Erzeugung eines BinaryExpression-Objekts für eine Addition. Diese generische Klasse erwartet eine Typangabe in Form eines Delegate. Sie verwaltet den Ausdrucksbaum eines Lambda-Ausdrucks. Ein Lambda-Ausdruck, der dem Delegate TDelegate entspricht, kann in eine Instanz von Expression<TDelegate> konvertiert werden, um den Ausdrucksbaum auswerten zu können, den der Lambda- Ausdruck ergibt. Expression<TDelegate> ist von LambdaExpression abgeleitet und kann deswegen kompiliert und ausgeführt werden. Diese Klasse steht für Ausdrücke mit zwei Operanden. Die Operanden werden in den Eigenschaften Left und Right verwaltet und referenzieren Expression-Instanzen, also wieder alle möglichen anderen Ausdrucks-Objekte. BinaryExpression-Instanzen werden über verschiedene statische Methoden der Expression-Klasse, wie z. B. Add, Divide, Modulo, Multiply, Power, Subtract, And und Or erzeugt. Diese Klasse ermöglicht die Definition einer Bedingung im Ausdrucksbaum. Die Bedingung wird in der Eigenschaft Test verwaltet. Ergibt die Bedingung true, wird der Baum an dem Ausdruck weiter ausgeführt, der in der Eigenschaft IfTrue referenziert wird, im anderen Fall an dem Ausdruck, den die Eigenschaft IfFalse referenziert. Conditional- Expression-Instanzen erzeugen Sie über die statische Condition-Methode der Expression-Klasse. Instanzen dieser Klasse verwalten in ihrer Eigenschaft Value konstante Werte, die in einem Ausdruck verwendet werden. LambdaExpression stellt einen Lambda-Ausdruck dar. Im Wesentlichen handelt es sich dabei um einen Ausdrucksbaum mit einer Auflistung der verwendeten Parameter. Der Ausdrucksbaum wird in der Eigenschaft Body verwaltet, die Parameter in der Eigenschaft Parameters. Lambda- Expression-Instanzen erlauben das Kompilieren und das Ausfüllen des Ausdrucksbaums. Diese Klasse steht für Ausdrücke, die einen Methodenaufruf darstellen. Die aufzurufende Methode wird in der Eigenschaft Method verwaltet. Die Eigenschaft Object referenziert das Ausdrucksbäume 9

12 ParameterExpression UnaryExpression Objekt, auf dem die Methode ausgeführt werden soll. Object ist null wenn es sich um eine statische Methode handelt. Die Eigenschaft Arguments verwaltet die Argumente, die der Methode übergeben werden sollen. MethodCallExpression-Instanzen werden über die statischen Methoden Call, ArrayIndex, oder ArrayIndex der Expression-Klasse erzeugt. ParameterExpression-Objekte verwalten die in einem Ausdruck verwendeten Parameter. Der Name des Parameters wird in der Eigenschaft Name verwaltet, der Typ in der (von Expression geerbten) Eigenschaft Type. Diese Klasse repräsentiert einen unären Ausdruck, also einen Ausdruck mit nur einem Operanden. Das kann z. B. ein Vorzeichenwechsel sein. Der Operand wird in der Eigenschaft Operand verwaltet. Tabelle 4.1: Die wichtigen Klassen zur Darstellung von Ausdrucksbäumen Neben den in Tabelle 4.1 angegebenen Klassen enthält der Namensraum System.Linq.Expressions noch die Klassen InvocationExpression, ListInit- Expression, MemberExpression, MemberInitExpression, NewArrayExpression, NewExpression und TypeBinaryExpression, die hier nicht weiter beschreiben kann. Um die Arbeit mit Ausdrucksbäumen zu demonstrieren, erzeugt das folgende Beispiel ein Ausdrucksbaum für die Brutto-Berechnung vom Anfang dieses Abschnitts. ParameterExpression netparameterexpression = Expression.Parameter(typeof(double), "net"); ParameterExpression vatparameterexpression = Expression.Parameter(typeof(double), "vat"); Expression grossexpression = Expression.Multiply( netparameterexpression, Expression.Add( Expression.Constant(1D), Expression.Divide( vatparameterexpression, Expression.Constant(100D)))); Kommentar [JB1]: Überprüfen Listing 4.1: Explizite Erzeugung eines Ausdrucksbaums für eine Bruttoberechnung Zu diesem Beispiel ist anzumerken, dass die verwendeten ParameterExpression-Instanzen deswegen separat erzeugt werden, weil diese später, beim Kompilieren und Ausführen des Ausdrucks, noch einmal benötigt werden. Den erzeugten Baum können Sie sich über einen Visual-Studio-Visualisierer anschauen. Halten Sie das Programm dazu an einer Anweisung hinter der Erzeugung des Expression-Objekts an, bewegen Sie den Cursor auf die Variable und wählen Sie den EXPRESSION TREE VISUALIZER. Dieser Visualisierer zeigt den Ausdrucksbaum in seiner grafischen Struktur an. Kommentar [JB2]: Ist der Expression Tree Visualizer Bestandteil von VS? Ansonsten Installation über die LINQ-Samples beschreiben Ausdrucksbäume 10

13 Abbildung 4.2: Anzeige des Bruttoberechnungs-Ausdrucksbaums über den Expression Tree Visualizer Kommentar [JB3]: Name checken Ausdrucksbäume können Sie nun ausführen oder auswerten. Zum Ausführen eines Ausdrucksbaums muss dieser allerdings in eine LambdaExpression-Instanz eingehüllt werden. Eine solche erlaubt das Kompilieren des Ausdrucks über die Compile-Methode. Compile erzeugt aus dem Ausdruck eine Methode und gibt eine Delegate- Referenz zurück. Über die DynamicInvoke-Methode des Delagate können Sie die Ausdrucks-Methode dann ausführen. Eine LambdaExpression-Instanz verwaltet denen auszuführenden Ausdrucksbaum in der Eigenschaft Body. Da Ausdrucksbäume auch Parameter enthalten können, die an beliebigen Stellen im Baum angelegt sein können, müssen diese auch übergeben werden können. Dazu erwartet eine LambdaExpression-Instanz zunächst eine Auflistung der verwendeten ParameterExpression-Objekte in der Eigenschaft Parameters. Diese Auflistung bestimmt lediglich die Reihenfolge der Parameter, in der deren Werte später der DynamicInvoke- Methode übergeben werden. Den Ausdrucksbaum und die Parameter übergeben Sie der statischen Lambda-Methode der Expression-Klasse um eine LambdaExpression-Instanz zu erzeugen. Ausdrucksbäume 11

14 Die an die LambdaExpression-Instanz übergebenen ParameterExpression- Instanzen müssen dieselben sein, die in dem Ausdrucksbaum verwendet werden. Laut einem Posting 1 von Anders Hejlsberg, dem Chef-Entwickler von C#, werden Parameterausdrücke nicht über deren Namen identifiziert, sondern über die Objekt- Referenz. Der Name hat laut Anders nur informativen Charakter. Wenn Sie stattdessen neue ParameterExpression-Instanzen (mit denselben Namen) übergeben, erhalten Sie beim Kompilieren des Ausdrucks u. U. 2 den Fehler»Lambda Parameter not in scope«. Das ist in meinen Augen sehr verwirrend und fehlerträchtig. Aber sei's drum... Kommentar [JB4]: Überprüfen Der Beispiel-Ausdrucksbaum kann also folgendermaßen ausgeführt werden: ParameterExpression[] parameters = new ParameterExpression[] netparameterexpression, vatparameterexpression ; LambdaExpression grosslambdaexpression = Expression.Lambda(grossExpression, parameters); double net = 1000; double vat = 19; object result = grosslambdaexpression.compile().dynamicinvoke(net, vat); Listing 4.2: Ausführen eines LambdaExpression-Objekts Wenn ein Ausdrucksbaum nicht ausgeführt, sondern so ausgewertet werden soll, dass es in eine spezielle Sprache übersetzt wird (z. B. in SQL), könne Sie dies erreichen, indem Sie die einzelnen Knoten des Baums vom Wurzel-Ausdruck aus durchgehen. Jeden Knoten müssen Sie dann auf die von Ihrem Konvertierer unterstützten Expression-Klassen überprüfen, in diese umwandeln und ggf. die weiteren Informationen der jeweiligen Instanz auswerten. Da dieser Vorgang recht komplex ist, zeige ich in Listing 4.3 nur beispielhaft, wie ein Ausdrucksbaum in sein SQL-Äquivalent umgesetzt werden könnte. Das Beispiel ist allerdings unvollständig und müsste für die Praxis noch wesentlich erweitert werden. private static string EvaluateExpressionAsSql(Expression expression) string result = null; // Überprüfen auf die unterstützten Typen if (expression is BinaryExpression) BinaryExpression binaryexpression = expression as BinaryExpression; // Ermittlung des Operators string op = null; switch (binaryexpression.nodetype) case ExpressionType.Add: op = "+"; case ExpressionType.And: op = "AND"; case ExpressionType.Divide: op = "/"; case ExpressionType.Equal: op = "="; 1 Auch wenn der Link nicht für ewig funktionieren wird: forums.microsoft.com/msdn/showpost.aspx?postid= &siteid=1 2 In meinen Tests trat der Fehler nur dann auf, wenn der Ausdrucksbaum mehr als einen Parameter enthielt Ausdrucksbäume 12

15 case ExpressionType.GreaterThan: op = ">"; case ExpressionType.GreaterThanOrEqual: op = ">="; case ExpressionType.LessThan: op = "<"; case ExpressionType.LessThanOrEqual: op = "<="; case ExpressionType.Modulo: op = "mod"; case ExpressionType.Multiply: op = "*"; case ExpressionType.Not: op = "NOT"; case ExpressionType.NotEqual: op = "<>"; case ExpressionType.Or: op = "OR"; case ExpressionType.Power: case ExpressionType.Subtract: op = "-"; default: throw new NotSupportedException( "Nicht unterstützer Operator '" + expression.nodetype + "'"); // Rekursiver Aufruf mit dem linken und dem rechten Operanden result = "(" + EvaluateExpressionAsSql(binaryExpression.Left) + ") " + op + " (" + EvaluateExpressionAsSql(binaryExpression.Right) + ")"; else if (expression is ConstantExpression) // Auslesen des Konstantenwerts ConstantExpression constantexpression = expression as ConstantExpression; if (constantexpression.type.name.startswith("int") constantexpression.type.name.startswith("uint") constantexpression.type == typeof(float) constantexpression.type == typeof(double) constantexpression.type == typeof(decimal)) result = String.Format(CultureInfo.CreateSpecificCulture("en"), "0", constantexpression.value); else if (constantexpression.type == typeof(string)) result = "'" + constantexpression.value.tostring() + "'"; else throw new NotSupportedException("Der Konstantentyp '" + constantexpression.type.name + "' wird nicht unterstützt"); else if (expression is ParameterExpression) // Auslesen des Namens Ausdrucksbäume 13

16 ParameterExpression parameterexpression = expression as ParameterExpression; result = + parameterexpression.name; else throw new NotSupportedException("Der Ausdruckstyp '" + expression.gettype().name + "' wird nicht unterstützt"); return result; Listing 4.3: Beispiel für die Auswertung eines Ausdrucksbaums (als SQL-String) Ausdrucksbäume 14

Spracherweiterungen von C# 3.5

Spracherweiterungen von C# 3.5 Microsoft Press Seitenanzahl 13 45 Spracherweiterungen von C# 3.5 Lokale Typinferenz 1213 Erweiterungsmethoden 1214 Objektinitialisierer 1216 Anonymer Typ 1217 Lambda-Ausdrücke 1218 Die Spracherweiterungen

Mehr

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein (kmk@informatik.uni-kiel.

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein (kmk@informatik.uni-kiel. Java Crashkurs Kim-Manuel Klein (kmk@informatik.uni-kiel.de) May 7, 2015 Quellen und Editoren Internet Tutorial: z.b. http://www.java-tutorial.org Editoren Normaler Texteditor (Gedit, Scite oder ähnliche)

Mehr

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung Übersicht 3.1 Modell Konto 3.2 Modell Konto - Erläuterungen 3.3 Benutzer Ein- und Ausgabe mit Dialogfenster I 3.4 Benutzer Ein- und Ausgabe mit Dialogfenster II 3.5 Klassen- und Objekteigenschaften des

Mehr

5.4 Klassen und Objekte

5.4 Klassen und Objekte 5.4 Klassen und Objekte Zusammenfassung: Projekt Figuren und Zeichner Figuren stellt Basisklassen für geometrische Figuren zur Verfügung Zeichner bietet eine übergeordnete Klasse Zeichner, welche die Dienstleistungen

Mehr

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Übung 1 mit C# 6.0 MATTHIAS RONCORONI Übung 1 mit C# 6.0 MATTHIAS RONCORONI Inhalt 2 1. Überblick über C# 2. Lösung der Übung 1 3. Code 4. Demo C# allgemein 3 aktuell: C# 6.0 mit.net-framework 4.6: Multiparadigmatisch (Strukturiert, Objektorientiert,

Mehr

Modul 122 VBA Scribt.docx

Modul 122 VBA Scribt.docx Modul 122 VBA-Scribt 1/5 1 Entwicklungsumgebung - ALT + F11 VBA-Entwicklungsumgebung öffnen 2 Prozeduren (Sub-Prozeduren) Eine Prozedur besteht aus folgenden Bestandteilen: [Private Public] Sub subname([byval

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Ich liebe Java && Ich liebe C# Rolf Borst

Ich liebe Java && Ich liebe C# Rolf Borst Ich liebe Java && Ich liebe C# Rolf Borst Java oder C#? Einführung public class Einfuehrung { private int gesamtzahl = 0; /* Ermittelt die Anzahl der geraden und durch drei teilbaren Zahlen */ public String

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung 1. "Hai!" [Konsolenanwendung] Console.WriteLine("Hai, wie geht's?"); 2. Muktiplikation mit sich selbst [Konsolenanwendung] // Ausgabe

Mehr

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7 Java 7 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Dezember 2011 JAV7 5 Java 7 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

Jürgen Bayer. MDI-Anwendungen in C#

Jürgen Bayer. MDI-Anwendungen in C# Jürgen Bayer MDI-Anwendungen in C# Inhaltsverzeichnis 1 Grundlagen 2 1.1 Einrichten der Formulare 2 1.2 Öffnen von MDI-Childformularen 3 2 Menüs 4 2.1 Erstellen eines Menüs 4 2.2 Programmierung der Menüpunkte

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Erwin Grüner 09.02.2006

Erwin Grüner 09.02.2006 FB Psychologie Uni Marburg 09.02.2006 Themenübersicht Folgende Befehle stehen in R zur Verfügung: {}: Anweisungsblock if: Bedingte Anweisung switch: Fallunterscheidung repeat-schleife while-schleife for-schleife

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen

Mehr

Programmierung in C. Grundlagen. Stefan Kallerhoff

Programmierung in C. Grundlagen. Stefan Kallerhoff Programmierung in C Grundlagen Stefan Kallerhoff Vorstellungsrunde Name Hobby/Beruf Schon mal was programmiert? Erwartungen an den Kurs Lieblingstier Für zu Hause C-Buch online: http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/

Mehr

Einführung in die C++ Programmierung für Ingenieure

Einführung in die C++ Programmierung für Ingenieure Einführung in die C++ Programmierung für Ingenieure MATTHIAS WALTER / JENS KLUNKER Universität Rostock, Lehrstuhl für Modellierung und Simulation 14. November 2012 c 2012 UNIVERSITÄT ROSTOCK FACULTY OF

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 4 Einführung in die Programmiersprache Java (Teil II)... 4-2 4.4 Strukturierte Programmierung... 4-2 4.4.1 Strukturierung im Kleinen... 4-2 4.4.2 Addierer (do-schleife)... 4-3 4.4.3 Ein- Mal- Eins

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Neue Features in C# 2.0

Neue Features in C# 2.0 Neue Features in C# 2.0 (gekürzt) Generische Typen Iteratoren Vereinfachte Delegate-Erzeugung Anonyme Methoden Partielle Klassen Sonstiges University of Linz, Institute for System Software, 2004 published

Mehr

Klausur C-Programmierung / 15.02.2014 / Klingebiel / 60 Minuten / 60 Punkte

Klausur C-Programmierung / 15.02.2014 / Klingebiel / 60 Minuten / 60 Punkte Klausur C-Programmierung / 15.02.2014 / Klingebiel / 60 Minuten / 60 Punkte Musterlösung 1. Aufgabe (5 Punkte) Im folgenden Programmcode sind einige Fehler enthalten. Finden und markieren Sie mindestens

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Besonderheiten von C#

Besonderheiten von C# Besonderheiten von C# Wert- und Referenztypen int a, b; a = 3; b = a; a++; Debug.Assert( a==4 && b==3 &&!a.equals(b), "int ist doch kein Werttyp" ); RTyp ra, rb; ra = new RTyp(3); rb = ra; ra.inc(); Debug.Assert(

Mehr

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

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1 Kapitel 11 Fehler und Ausnahmen Fehler und Ausnahmen 1 Ziele Fehlerquellen in Programmen und bei der Programmausführung verstehen Das Java-Konzept der Ausnahmen als Objekte kennenlernen Ausnahmen auslösen

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023 Kapitel 33 Der xml-datentyp In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023 995 996 Kapitel 33: Der xml-datentyp Eine der wichtigsten

Mehr

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe Prof. Dr. Oliver Haase Oliver Haase Hochschule Konstanz 1 Was sind Operatoren? Ein Operator ist eine in die Programmiersprache eingebaute Funktion,

Mehr

Deklarationen in C. Prof. Dr. Margarita Esponda

Deklarationen in C. Prof. Dr. Margarita Esponda Deklarationen in C 1 Deklarationen Deklarationen spielen eine zentrale Rolle in der C-Programmiersprache. Deklarationen Variablen Funktionen Die Deklarationen von Variablen und Funktionen haben viele Gemeinsamkeiten.

Mehr

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl Funktionen Zusammenfassung von Befehlssequenzen als aufrufbare/wiederverwendbare Funktionen in einem Programmblock mit festgelegter Schnittstelle (Signatur) Derartige prozedurale Programmierung erlaubt

Mehr

Java Einführung Operatoren Kapitel 2 und 3

Java Einführung Operatoren Kapitel 2 und 3 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig

Mehr

Die Programmiersprache C99: Zusammenfassung

Die Programmiersprache C99: Zusammenfassung Die Programmiersprache C99: Zusammenfassung Jörn Loviscach Versionsstand: 7. Dezember 2010, 19:30 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung. Videos dazu: http://www.youtube.com/joernloviscach

Mehr

Folge 18 - Vererbung

Folge 18 - Vererbung Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,

Mehr

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten O Reillys Taschenbibliothek 3. Auflage C# 5.0 kurz & gut O REILLY Joseph Albahari & Ben Albahari Aktualisierung von Lars Schulten Inhalt C# 5.0 kurz & gut... 1 Ein erstes C#-Programm... 2 Syntax... 5 Typgrundlagen...

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 4 Anweisungen... 4-2 4.1 Strukturierte Programmierung... 4-2 4.1.1 Geschichte... 4-2 4.1.2 Strukturierung im Kleinen... 4-2 4.2 Einige Beispielanwendungen... 4-4 4.2.1 Addierer (do-schleife)...

Mehr

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen. 3. Programmiersprache Visual Basic. 4. Grundlagen der Datenbanktechnologie.

Inhalt. 1. Einführung in die Informatik. 2. Algorithmen. 3. Programmiersprache Visual Basic. 4. Grundlagen der Datenbanktechnologie. 1. Einführung in die Informatik Inhalt 2. Algorithmen 3. Programmiersprache Visual Basic 4. Grundlagen der Datenbanktechnologie Peter Sobe 1 Programmiersprache Visual Basic Inhalt des Abschnitts Varianten

Mehr

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16 Fakultät für Informatik Lehrstuhl 14 Lars Hildebrand, Marcel Preuß, Iman Kamehkhosh, Marc Bury, Diana Howey Übungsblatt

Mehr

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Kontrollstrukturen, Pseudocode und Modulo-Rechnung Kontrollstrukturen, Pseudocode und Modulo-Rechnung CoMa-Übung III TU Berlin 29.10.2012 CoMa-Übung III (TU Berlin) Kontrollstrukturen, Pseudocode und Modulo-Rechnung 29.10.2012 1 / 1 Themen der Übung 1

Mehr

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

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Modellierung und Programmierung 1

Modellierung und Programmierung 1 Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 19. November 2015 Gültigkeitsbereich (Scope) von Variablen { int m; {

Mehr

Methoden (fortgeschritten) in C# - 1

Methoden (fortgeschritten) in C# - 1 Methoden (fortgeschritten) in C# - 1 Marc Satkowski 20. November 2016 C# Kurs Gliederung 1. Opertatoren Überladung 2. delegate 3. Anonyme Methoden delegate Lamda Ausdruck-Lamdas Anweisung-Lamdas Variablenbereich

Mehr

Objektorientierte Programmierung mit C++ Vector und List

Objektorientierte Programmierung mit C++ Vector und List Vector und List Ziel, Inhalt Wir lernen die Klassen vector und list aus der Standard-C++ Library kennen und anwenden. In einer Übung wenden wir diese Klassen an um einen Medienshop (CD s und Bücher) zu

Mehr

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

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung.

Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung. Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung. Die heutige Sitzung dient dem ersten Kennenlernen von MATLAB. Wir wollen MATLAB zuerst

Mehr

Fertigungssimulationen mit Plant Simulation und SimTalk

Fertigungssimulationen mit Plant Simulation und SimTalk Fertigungssimulationen mit Plant Simulation und SimTalk Anwendung und Programmierung mit Beispielen und Lösungen von Steffen Bangsow 1. Auflage Hanser München 2008 Verlag C.H. Beck im Internet: www.beck.de

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund - mit / ohne Parameter - mit / ohne Rückgabewerte

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Einführung in die Programmierung

Einführung in die Programmierung : Inhalt Einführung in die Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund Wiederholungen - while - do-while - for

Mehr

Primitive Datentypen

Primitive Datentypen Primitive Datentypen 2 Arten von Datentypen: primitive Datentypen (heute) Objekte (später) Java ist streng typisiert, d.h. für jede Variable muß angegeben werden was für eine Art von Wert sie aufnimmt.

Mehr

Klassenbeziehungen & Vererbung

Klassenbeziehungen & Vererbung Klassenbeziehungen & Vererbung VL Objektorientierte Programmierung Raimund Kirner teilweise nach Folien von Franz Puntigam, TU Wien Überblick Arten von Klassenbeziehungen Untertypen versus Vererbung in

Mehr

JSP JSTL. JEE Vorlesung Teil 6. Ralf Gitzel ralf_gitzel@hotmail.de

JSP JSTL. JEE Vorlesung Teil 6. Ralf Gitzel ralf_gitzel@hotmail.de JSP JSTL JEE Vorlesung Teil 6 Ralf Gitzel ralf_gitzel@hotmail.de 1 Übersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht Wiederholung / Vertiefung JSTL Grundlagen JSTL Basisbefehle Templates über JSTL

Mehr

Rainer Stropek cubido. Baumschule Expression Trees in C#, CLR und DLR

Rainer Stropek cubido. Baumschule Expression Trees in C#, CLR und DLR Rainer Stropek cubido Baumschule Expression Trees in C#, CLR und DLR Inhalt Als Anwendungsentwickler kommt man selten mit Expression Trees in Berührung. Sie sind ein Implementierungsdetail von LINQ. Ihre

Mehr

Fallunterscheidung: if-statement

Fallunterscheidung: if-statement Fallunterscheidung: if-statement A E 1 E 2 V 1 V 2 Syntax: if ( ausdruck ) Semantik: else anweisungsfolge_1 anweisungsfolge_2 1. Der ausdruck wird bewertet 2. Ergibt die Bewertung einen Wert ungleich 0

Mehr

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler Inhaltsverzeichnis Grundbegriffe der C-Programmierung 1. Grundsätzliches... 2 1.1 Darstellung von Werten... 2 1.1.1 Dezimale Zahlendarstellung... 2 1.1.2 Binäre Zahlendarstellung... 3 1.1.3 Hexadezimale

Mehr

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit Variablen (Sinn und Aufgabe) Bezeichner Datentypen, Deklaration und Operationen Typenumwandlung (implizit/explizit) 2 Variablen

Mehr

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff Die Java Stream API Funktionale Programmierung mit der Stream API des JDK 1.8 Prof. Dr. Nikolaus Wulff Funktionale Programmierung Neben der Collection API mit default Methoden ist als weitere Neuerung

Mehr

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4. Agenda für heute, 4. Mai, 2006 Programmierparadigmen Imperative Programmiersprachen In Prozeduren zusammengefasste, sequentiell ausgeführte Anweisungen Die Prozeduren werden ausgeführt, wenn sie als Teil

Mehr

Entwicklung der Programmiersprache C#

Entwicklung der Programmiersprache C# Language Day HDM 2015 Entwicklung der Programmiersprache C# Referent: Mikhail Orleanskiy, IT-Designers GmbH (orleanskiy@it-designers.de) Stand: 6. November 2015 Eine Präsentation der IT-Designers Gruppe

Mehr

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell): Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel

Mehr

Eine Einführung in C-Funktionen

Eine Einführung in C-Funktionen Eine Einführung in C-Funktionen CGK-Proseminar 2014 Philip Gawehn 04.07.2014, Hamburg Inhaltsverzeichnis 1 Einleitung 2 2 Grundlagen 2 2.1 Der Aufbau einer Funktion....................... 2 2.2 Schlüsselwörter.............................

Mehr

Binärbäume. Prof. Dr. E. Ehses, 2014 1

Binärbäume. Prof. Dr. E. Ehses, 2014 1 Binärbäume Grundbegriffe der Graphentheorie Bäume und Ihre Anwendungen Unterschiedliche Darstellungen von Bäumen und Binärbäumen Binärbäume in Java Rekursive Traversierung von Binärbäumen Ebenenweise Traversierung

Mehr

Delegatesund Ereignisse

Delegatesund Ereignisse Delegatesund Ereignisse «Delegierter» Methoden Schablone Funktionszeiger Dr. Beatrice Amrhein Überblick Definition eines Delegat Einfache Delegate Beispiele von Delegat-Anwendungen Definition eines Ereignisses

Mehr

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only Methoden Wie Konstruktoren und Destruktoren zum Auf- und Abbau von Objekten definiert werden, Wie inline-methoden Methoden,, Zugriffsmethoden und Read-Only Only- Methoden einzusetzen sind, Der this-pointer

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Der hat die früher handschriftlichen Folien lesbar gemacht. Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Heutige Themen Hello World!

Mehr

Lua Grundlagen Einführung in die Lua Programmiersprache

Lua Grundlagen Einführung in die Lua Programmiersprache Lua Grundlagen Einführung in die Lua Programmiersprache 05.05.2014 Ingo Berg berg@atvoigt.de Automatisierungstechnik Voigt GmbH Die Lua Programmiersprache Was ist Lua? freie Programmiersprache speziell

Mehr

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik Informatik I WS 2012/13 Tutorium zur Vorlesung 1. Alexander Zietlow zietlow@informatik.uni-tuebingen.de Wilhelm-Schickard-Institut für Informatik Eberhard Karls Universität Tübingen 11.02.2013 1. 2. 1.

Mehr

Auszug aus. C sharp. Galileo Computing. Ein Service von. Tutorial und Referenz. von Eric Gunnerson

Auszug aus. C sharp. Galileo Computing. Ein Service von. Tutorial und Referenz. von Eric Gunnerson Auszug aus C sharp Tutorial und Referenz von Eric Gunnerson Galileo Computing 576 S., 2002, geb. 39,90 Euro, ISBN 3-89842-183-X Ein Service von Galileo Computing aus: Eric Gunnerson, C sharp - Tutorial

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Abschnitt 9: Schnittstellen: Interfaces

Abschnitt 9: Schnittstellen: Interfaces Abschnitt 9: Schnittstellen: Interfaces 9. Schnittstellen: Interfaces 9.1 Die Idee der Schnittstellen 9.2 Schnittstellen in Java 9.3 Marker-Interfaces 9.4 Interfaces und Hilfsklassen 9.5 Zusammenfassung

Mehr

1. Grundlegende Konzepte in Java (6 Punkte)

1. Grundlegende Konzepte in Java (6 Punkte) 1. Grundlegende Konzepte in Java (6 Punkte) a) Welches der folgenden Literale ist korrekt und wenn ja, von welchem Typ ist es? "true" nicht korrekt X korrekt vom Typ String 'true' X nicht korrekt korrekt

Mehr

Ausarbeitung des Interpreter Referats

Ausarbeitung des Interpreter Referats Ausarbeitung des Interpreter Referats Gliederung 1. Programmiersprache 1.2. Syntax 1.2.1. Konkrete Syntax 1.2.2. Abstrakter Syntax Baum (Abstrakte Syntax) 2. Parser 2.1. Syntaktische Struktur einer Sprache

Mehr

Grundlagen der Programmiersprache C++

Grundlagen der Programmiersprache C++ / TU Braunschweig Grundlagen der Programmiersprache C++ Um den Studierenden den Einstieg in die FE-Programmierung zu erleichtern werden die wesentlichen Elemente eines C-Programmes beschrieben, soweit

Mehr

LINQ to SQL. Proseminar Objektorientiertes Programmieren mit.net und C# Christoph Knüttel. Institut für Informatik Software & Systems Engineering

LINQ to SQL. Proseminar Objektorientiertes Programmieren mit.net und C# Christoph Knüttel. Institut für Informatik Software & Systems Engineering LINQ to SQL Proseminar Objektorientiertes Programmieren mit.net und C# Christoph Knüttel Institut für Informatik Software & Systems Engineering Agenda 1. LINQ allgemein Vorteile Bausteine und Varianten

Mehr

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20. Übersicht Datenstrukturen und Algorithmen Vorlesung 5: (K4) Joost-Pieter Katoen Lehrstuhl für Informatik 2 Software Modeling and Verification Group http://www-i2.informatik.rwth-aachen.de/i2/dsal12/ 20.

Mehr

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18

Mehr

Gebundene Typparameter

Gebundene Typparameter Gebundene Typparameter interface StringHashable { String hashcode(); class StringHashMap { public void put (Key k, Value v) { String hash = k.hashcode();...... Objektorientierte

Mehr

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections Leibniz Universität IT Services Anja Aue Arrays... speichern mehrere Werte vom gleichen Datentyp. fassen zusammenhängende Werte

Mehr

Das Liskovsche Substitutionsprinzip

Das Liskovsche Substitutionsprinzip Kapitel 7 Das Liskovsche Substitutionsprinzip Am Ende dieses Kapitels werden Sie in der Lage sein, die folgenden Aufgaben durchzuführen: Beschreiben der Bedeutung des Liskovschen Substitutionsprinzips

Mehr

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich 13 OOP MIT DELPHI Delphi war früher "Object Pascal". Dieser Name impliziert eine Funktionalität, welche in der Welt der Programmierung nicht mehr wegzudenken ist: die objektorientierte Programmierung,

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Typdeklarationen. Es gibt in Haskell bereits primitive Typen: Typdeklarationen Es gibt in bereits primitive Typen: Integer: ganze Zahlen, z.b. 1289736781236 Int: ganze Zahlen mit Computerarithmetik, z.b. 123 Double: Fließkommazahlen, z.b. 3.14159 String: Zeichenketten,

Mehr

1 Polymorphie (Vielgestaltigkeit)

1 Polymorphie (Vielgestaltigkeit) 1 Polymorphie (Vielgestaltigkeit) Problem: Unsere Datenstrukturen List, Stack und Queue können einzig und allein int-werte aufnehmen. Wollen wir String-Objekte, andere Arten von Zahlen oder andere Objekttypen

Mehr

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio 16.04.2015 1/9

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio 16.04.2015 1/9 BTree.dll Realisiert mit Microsoft Visual Studio 16.04.2015 1/9 INHALT 1. Allgemein... 3 2. Class BTree1 (balanciert)... 3 3. Class BTree2 (balanciert und verkettet)... 4 4. Beschreibung BTree1 und BTree2...

Mehr

Teil A Einführung in Microsoft Visual C# und Microsoft Visual Studio 2008 23

Teil A Einführung in Microsoft Visual C# und Microsoft Visual Studio 2008 23 Einleitung 13 Einführung 13 An wen sich dieses Buch richtet 13 Wegweiser für Ein- und Umsteiger 14 Konventionen und Features in diesem Buch 15 Konventionen 15 Weitere Features 16 Systemvoraussetzungen

Mehr

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Grundlagen. Die Komponenten eines C Programms. Das erste Programm Grundlagen 1. Die Komponenten eines C Programms 2. Ein Programm erzeugen und übersetzen 3. Variablen Deklarieren und Werte zuweisen 4. Zahlen eingeben mit der Tastatur 5. Arithmetische Ausdrücke und Berechnungen

Mehr

BEISPIELKLAUSUR Softwareentwicklung:

BEISPIELKLAUSUR Softwareentwicklung: Prof. Dr. Andreas Fink Institut für Informatik Fakultät für Wirtschafts- und Sozialwissenschaften Helmut-Schmidt-Universität / Universität der Bundeswehr Hamburg BEISPIELKLAUSUR Softwareentwicklung: Objektorientierte

Mehr

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt 14.4.2016 Technische Hochschule Georg Agricola WORKSHOP TEIL 3 IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Morse-Tabelle...

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

Ein anonymer-methodenausdruck definiert eine anonyme Methode und ergibt einen Wert, der auf diese Methode verweist. primärer-nicht-array-ausdruck:

Ein anonymer-methodenausdruck definiert eine anonyme Methode und ergibt einen Wert, der auf diese Methode verweist. primärer-nicht-array-ausdruck: 21 Anonyme Methoden 21.1 Ausdrücke mit anonymen Methoden Ein anonymer-methodenausdruck definiert eine anonyme Methode und ergibt einen Wert, der auf diese Methode verweist. primärer-nicht-array-ausdruck:...

Mehr

Programmierung in Python

Programmierung in Python Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales und rekursives Programmieren P raktische Informatik 1, W S 2004/05, F olien P

Mehr

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2 Prof. aa Dr. J. Giesl Programmierung WS16/17 F. Frohn, J. Hensel, D. Korzeniewski Tutoraufgabe 1 (Zweierkomplement): a) Sei x eine ganze Zahl. Wie unterscheiden sich die Zweierkomplement-Darstellungen

Mehr

Zusammengesetzte Datentypen -- Arrays und Strukturen

Zusammengesetzte Datentypen -- Arrays und Strukturen Zusammengesetzte Datentypen -- und Strukturen Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling benedict.reuschling@h-da.de Hochschule Darmstadt Fachbereich Informatik WS 2013/14

Mehr

Einführung in die C-Programmierung

Einführung in die C-Programmierung Einführung in die C-Programmierung Warum C? Sehr stark verbreitet (Praxisnähe) Höhere Programmiersprache Objektorientierte Erweiterung: C++ Aber auch hardwarenahe Programmierung möglich (z.b. Mikrokontroller).

Mehr

Container-Klassen in Delphi

Container-Klassen in Delphi Verwalten von Objekten mit Hilfe von Container-Klassen am Beispiel eines Memory Spieles Container-Klassen in Delphi Michael Puff mail@michael-puff.de 2010-03-26 Inhaltsverzeichnis Inhaltsverzeichnis 1

Mehr

Computeranwendung und Programmierung (CuP)

Computeranwendung und Programmierung (CuP) Computeranwendung und Programmierung (CuP) VO: Peter Auer (Informationstechnologie) UE: Norbert Seifter (Angewandet Mathematik) Organisatorisches (Vorlesung) Vorlesungszeiten Montag 11:15 12:45 Freitag

Mehr

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek Proseminar C-Programmierung Strukturen Von Marcel Lebek Index 1. Was sind Strukturen?...3 2. Padding 5 3. Vor- und Nachteile von Padding..8 4. Padding gering halten 9 5. Anwendungsgebiete von Strukturen.11

Mehr