Laden...

Für ein Event eine anonyme Methode registrieren

Erstellt von wpf23 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.768 Views
W
wpf23 Themenstarter:in
185 Beiträge seit 2009
vor 13 Jahren
Für ein Event eine anonyme Methode registrieren

Hallo,

wenn das hier ein Button ist kann ich dort irgendwie eine anonyme klasse hintendran hängen?

add.Click += new RoutedEventHandler(add_Click);

Also welche Möglichkeiten hab ich?

Viele Grüße

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo wpf23,

wenn das hier ein Button ist kann ich dort irgendwie eine anonyme klasse hintendran hängen?

Was genau meinst du mit "anonyme Klasse"?
Diese können lediglich aus Properties bestehen und werden im Normalfall ausschließlich im Zusammenhang mit LINQ genutzt.

Auch sonst verstehe ich nicht, was du eigentlich beabsichtigst.

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

ich gehe davon dass du anonyme Methode meinst. Dann gehts zB folgendes:


add.Click += (sender, eventArgs) => MessageBox.Show("Add geklickt");

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

W
wpf23 Themenstarter:in
185 Beiträge seit 2009
vor 13 Jahren

In Java heißt es anonyme Klasse.

d.h. man erzeugt on the fly eine Klasse

bla(new K() {

//
});

gfoidl danke!

5.742 Beiträge seit 2007
vor 13 Jahren

In Java heißt es anonyme Klasse

Aha - auf Java bezogen... (die 3 Punkte sind nicht abwertend gemeint! Oder vielleicht doch :evil:)

In C# hat das Behandeln von Events relativ wenig mit Klassen zu tun: Stattdessen existieren sogenannte Delegaten (ein Art Referenz auf Methoden).
Das Beispiel von gfoidl liefert hängt einen Delegaten an das Event an, der auf eine vom Compiler generierte Methode der Klasse, in der das ganze steht, zeigt.
Das nur als Hintergrundinfo - in manchen Fällen können dadurch ziemliche Unterschiede zwischen C# und Java entstehen.

Anonyme Klassen gibt's in C# auch - die sehen aber so aus:


var anonymeKlasse = new { FirstName="Max", LastName="Mustermann" };
//Zugriff:
string firstName = anonymeKlasse.FirstName

Allerdings können diese - wie gesagt - keine Methoden bereitstellen.

6.862 Beiträge seit 2003
vor 13 Jahren

Anonyme Klassen gibt's in C# auch ...
Allerdings können diese - wie gesagt - keine Methoden bereitstellen.

Das ist so nicht ganz korrekt 😃
Folgendes funktioniert problemlos:


			var Testclass = new { 
				PrintHello = new Action(() => Console.WriteLine("Hello")), 
				SquareDouble = new Func<double,double>((x) => x*x)
			};
			Testclass.PrintHello(); // Gibt "Hello" aus
			Console.WriteLine(Testclass.SquareDouble(5)); // Gibt 25 aus

Wie schon gesagt wurde, sind die anonymen Klassen in C# nicht bei dem Anwendungsfall mit Events notwendig. In Java dagegen muss man die einsetzen, weils einfach nicht anders geht.

Baka wa shinanakya naoranai.

Mein XING Profil.

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo talla,

die anonyme Klasse hat trotzdem keine Methoden, nur Eigenschaften und der Eigenschaftswert ist ein Delegat - nix mit Methoden 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

damit hast du nicht unrecht, aber die Delegates müssen auch auf irgend ne Funktion verweisen:) Die ist in dem Fall natürlich auch anonym implementiert (wenn auch ein klein wenig anders als ich vermutet hätte)

Baka wa shinanakya naoranai.

Mein XING Profil.

1.130 Beiträge seit 2007
vor 13 Jahren
add.Click += (sender, eventArgs) => MessageBox.Show("Add geklickt");  

Sobald man innerhalb der Methode eine lokale variable aus der methode, die das hinzufügen aufruft verwendet, wird intern aber doch eine "anonyme klasse" erzeugt, von der man aber sogut wie nix mitbekommt. (this wird vom compiler durch this.<>n_this ersetzt, was auf die klasse verweist, in der man den lambdaausdruck geschrieben hat.)

auch wenn die lambdasyntax meist praktischer ist, sollte man aber trotzdem die alte syntax kennen, mit der man allerdings keinerlei klassen definieren kann.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!