Laden...

Delegate Definition

Erstellt von Akula vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.298 Views
A
Akula Themenstarter:in
89 Beiträge seit 2007
vor 15 Jahren
Delegate Definition

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

2.760 Beiträge seit 2006
vor 15 Jahren

Hmm... schaut richtig aus. Mehr isses dann auch nicht.

A
Akula Themenstarter:in
89 Beiträge seit 2007
vor 15 Jahren

Wunderbar mehr wollte ich nicht wissen.

2.760 Beiträge seit 2006
vor 15 Jahren

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

A
Akula Themenstarter:in
89 Beiträge seit 2007
vor 15 Jahren

Ist das nicht dann wieder ein Event?

2.760 Beiträge seit 2006
vor 15 Jahren

Nein, events basieren auf delegates.

A
Akula Themenstarter:in
89 Beiträge seit 2007
vor 15 Jahren

das ist mir schon klar, nur Event keinne ich bis jetzt nur mit dem "+=".

49.485 Beiträge seit 2005
vor 15 Jahren

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

S
902 Beiträge seit 2007
vor 15 Jahren

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

O
778 Beiträge seit 2007
vor 15 Jahren

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.

A
Akula Themenstarter:in
89 Beiträge seit 2007
vor 15 Jahren

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

F
101 Beiträge seit 2007
vor 15 Jahren

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);
            }
        }
A
Akula Themenstarter:in
89 Beiträge seit 2007
vor 15 Jahren

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);

            
        }