Hallo, seit einiger Zeit sitze ich da und versuche diese Delegates zu verstehen, in dem Buch welches ich gekauft habe, werde diese sehr schelcht erklärt. Nun wenn ich es denoch richtig verstanden haben sollte, dienen sie dazu eine Funktion zu übergeben. Habe das mal versucht mit Hilfe des Beispiels nach zu stellen, stimmt das so?
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//Delegate erstellen
test newstest = null;
// Delegate initialisieren und übergeben der Funktion mit der gearbeitet werden soll
newstest = new test(ausgabe);
// erstellen einer neuen Klasse
Class1 testk = new Class1();
// Array ausgeben und übergabe des Delegates
testk.ziegen(newstest);
Console.ReadKey(true);
}
static void ausgabe(string message)
{
// Funktion der Ausgabe
Console.WriteLine(message);
}
}
}
class Class1
{
private int[] testarray;
// Array mit Werten füllen
private void erstellen()
{
Random rnd = new Random(DateTime.Now.Millisecond);
testarray = new int[20];
for (int i = 0; i < testarray.Length; i++)
{
int zahl = rnd.Next(0, 100);
testarray[i] = zahl;
}
}
// Array wird ausgegben; delegate test wird übergeben
public void ziegen(test message)
{
foreach (int s in testarray)
{
Console.WriteLine(s);
}
}
public Class1()
{
erstellen();
}
}
//Definition von Delegate; ausgelagert in einer externen Datei
public delegate void test( string message);
Ist das so richtig oder gibt es irgendwo im Weg eine genauere Definition?
Gruß Akula
Hmm... schaut richtig aus. Mehr isses dann auch nicht.
Naja eine Sache geht dann noch:
newstest += new test(ausgabe2);
newstest += new test(ausgabe3);
newstest += new test(ausgabe4);
Ist nämlich ein <see='MSDN'>MulticastDelegate</see>.
Nein, events basieren auf delegates.
Hallo Akula,
richtig. Auf events kann man außerhalb der definierenden Klasse nur mit += und -= zugreifen. Von dieser Einschränkung abgesehen sind aber auch Events normale Delegaten. Siehe auch SerializationException wegen Observer.
herbivore
ich möchte nix bemängeln, aber ich sehe in dem oberen beispiel keine wirkiche verwendung des delegaten!
Die ausgabe erfolgt doch seperat in der klasse duch Console.Write...müsste doch aber message(array_) o.ä lauten?!
mfg
serial
Die Frage war ja nach der Definition, nicht nach der Verwendung 🙂
Aber du hast Recht, der sauber definierte Delegate hat in dem Codeschnipsel keine Verwendung.
das habe ich auch selbst gestern abend noch festgestellt, als ich die Ausgabe in Rot versucht habe. Aber diese Problem habe ich gelöst, in dem ich einen String zurückgebe, wo zur zeit die Ausgabe steht.
string Wert = " ";
test(Wert ) // Rückgabe des Inhalt der Array
ich glaube die meinen
public void ziegen(test message)
{
foreach (int s in testarray)
{
Console.WriteLine(s);
}
}
... änder das mal in
public void ziegen(test message)
{
foreach (int s in testarray)
{
message(s);
}
}
Ja so habe ich es gelöst:
// Array wird ausgegben; delegate test wird übergeben
public void ziegen(test message)
{
string text = "Werte: ";
foreach (int s in testarray)
{
text += s.ToString() + ", ";
}
message(text);
}