PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisproblem C# anonyme Methoden


urpils
2006-09-13, 22:13:13
// Delegate-Deklaration
public delegate long MyDelegate(int x, int y);
class Program {
static void Main(string[] args) {
MyDelegate del = delegate(int value1, int value2)
// anonyme Methode
{
Console.Write("Die Parameterwerte sind: ");
Console.WriteLine("{0} und {1}", value1, value2);
return value1 + value2;
};
Console.WriteLine("Ergebnis = {0}", del(13, 34));
Console.ReadLine();
}
}

irgendwie verstehe ich den Sinn hinter dieser "anonymen Methode" nicht. Wo ist der Unterschied zu einer "normalen Methode" (in Aufbau, Anwendung, Bedeutung, Funktion,...).

das Bsp. hab ich von folgendem Link: Galileo Computing (http://www.galileocomputing.de/openbook/visual_csharp/visual_csharp_05_001.htm#Xxxobkap05001040017d61f016206)

vielen Dank schonmal!

Xmas
2006-09-13, 22:43:13
Man kann kurze Callbacks, die man nur an einer einzigen Stelle angibt, auch gerade an dieser Stelle definieren. Empfinden viele Menschen als übersichtlicher.

urpils
2006-09-13, 22:54:54
und wo ist dann der Unterschied hierzu:


class Program {
static void Main(string[] args) {
public int meineFunktion(int value1, int value2)
{
Console.Write("Die Parameterwerte sind: ");
Console.WriteLine("{0} und {1}", value1, value2);
return value1 + value2;
};
Console.WriteLine("Ergebnis = {0}", meineFunktion(13, 34));
Console.ReadLine();
}
}

?

Trap
2006-09-13, 23:08:49
Das Beispiel ist schlecht gewählt um das zu zeigen. anonyme Delegates sind sehr ähnlich zu lambda-funktionen und ein übliches Beispiel dafür wäre:
public delegate int Mydelegate(int a,int b);
public int reduce(int start,ArrayList l,Mydelegate x) {
// das übliche reduce hier
}

class Program {
static void Main(string[] args) {
ArrayList bla = //irgendwas
Console.WriteLine(reduce(0,bla,delegate(int a,int b) {return a+b})); //summiert alle elemente von bla
Console.WriteLine(reduce(1,bla,delegate(int a,int b) {return a*b})); //produkt aller elemente von bla
Console.WriteLine(reduce(-maxint,bla,delegate(int a,int b) {return max(a,b)})); //maximum aller elemente von bla
Console.ReadLine();
}
}

Link zum "üblichen reduce": http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29

Expandable
2006-09-13, 23:10:19
Trap hat ja schon ein besseres Beispiel geliefert. C# 3.0 unterstützt dann auch Lambda-Funktionen.

urpils
2006-09-13, 23:19:24
@Trap: danke für das Beispiel - ich seh es mir morgen mal genauer an!
@Expendable: dein erste (geänderter *g*) Kommentar hat mir tatsächlich geholfen :) ich weiß zwar nicht, was eine Lambda-Funktion ist, aber ich werd mich morgen einfach mal hinsetzen und ein bissel rumprobieren, bis ich diese "anonyme Methoden" Verstanden habe.

danke!!! :)

Expandable
2006-09-13, 23:51:31
@Expendable: dein erste (geänderter *g*) Kommentar hat mir tatsächlich geholfen :) i

Ja? Gut, ich hielt das dann doch für zu offensichtlich und arrogant ;)

RoKo
2006-09-14, 00:59:19
Trap hat ja schon ein besseres Beispiel geliefert. C# 3.0 unterstützt dann auch Lambda-Funktionen.
Die Lambdas in C#3 sind die selben wie in C#2, nur mit schönerer Syntax.

urpils
2006-09-14, 13:34:22
wo wir dabei sind:

was sind Lambdas? *g*

Trap
2006-09-14, 13:40:53
was sind Lambdas? *g*
http://de.wikipedia.org/wiki/Lambda-Kalkül (die Seite ist nicht besonders toll geschrieben, aber am einfachsten zu finden ;))

Monger
2006-09-14, 14:04:55
http://de.wikipedia.org/wiki/Lambda-Kalkül (die Seite ist nicht besonders toll geschrieben, aber am einfachsten zu finden ;))
Ja, aber was sind Lambda Funktionen? Funktionen, für die man ein Lambda Kalkül aufsetzen kann?

Trap
2006-09-14, 14:33:10
Ich glaube nicht, dass "lambda-Funktion" immer als Fachbegriff im Sinn des Lamba-Kalkül benutzt wird. Meist bezieht man sich nicht auf das lambda-Kalkül lambda, sondern auf das Scheme/Lisp lambda. Dort ist (lambda (a b) (+ a b)) ein Ausdruck der als Wert eine Funktion hat, die 2 Parameter erwartet und als Rückgabewert das Ergebnis von + angewendet auf die Parameter hat.

Allgemeiner gesagt sind lambda-Funktionen anonyme Funktionen bei denen man den "body" der Funktion mit möglichst wenig zusätzlichem Code/Text hinschreiben kann und der Ausdruck dann als Wert verwendet werden kann.

In Java kann man anonymous inner classes so benutzen, ist aber nicht wirklich elegant, man braucht mindestens ein Interface was man an anderer Stelle definieren muss um anonymous inner classes als lambdas zu benutzen.

SgtTynis
2006-09-15, 01:02:38
Die Lambdas in C#3 sind die selben wie in C#2, nur mit schönerer Syntax.

...besser ist das; der aktuelle Syntax sieht mir fuer das sonst so elegante C# arg frickelig aus, man erinnert sich einfach nicht intiutiv daran wie er zu schreiben ist.