delegate mit oder ohne new



  • Hallo,

    folgendes Beispiel vorab

    public class EineKlasse
        {
            public static void EineFunktion()
            {
                Console.WriteLine("EineFunktion()");
            }
            public static void EineAndereFunktion()
            {
                Console.WriteLine("EineAndereFunktion()");
            }
    
        }
    
        public delegate void DFUNC();
    
        class Program
        {
            static void Main(string[] args)
            {
                // 1.
                DFUNC func = EineKlasse.EineFunktion; 
                func(); 
    
                // 2.
                func = new DFUNC(EineKlasse.EineAndereFunktion); 
                func();
            }
        }
    

    MSDN beschreibt die Instanziierung eines Deleages wie unter 1.

    2. wird aber sehr häufig als "Einzeiler" beim Hinzufügen einer Funktion zu einem event genutzt:

    klasse.dasevent += new klasscode.myDelegate(...)
    

    Wir bei 1. new also implizit ausgeführt?

    Gruss
    foodax



  • Der IL Code ist zumindest in beiden Fällen gleich.



  • rente schrieb:

    Der IL Code ist zumindest in beiden Fällen gleich.

    Ja gute Idee, hätte ich auch mal schauen können 🙂 Schönen Dank.

    Hier noch mal als IL-Code in geraffter Form:

    .method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // Code size       27 (0x1b)
      .maxstack  8
      IL_0000:  ldnull
      IL_0001:  ldftn      void testconsole.Program::Funktion()
      IL_0007:  newobj     instance void testconsole.Program/F::.ctor(object,
                                                                      native int)
      IL_000c:  pop
      IL_000d:  ldnull
      IL_000e:  ldftn      void testconsole.Program::Funktion()
      IL_0014:  newobj     instance void testconsole.Program/F::.ctor(object,
                                                                      native int)
      IL_0019:  pop
      IL_001a:  ret
    } // end of method Program::Main
    

    für den folgenden C#-Code

    static void Funktion() {}
    
            public delegate void F();
    
            static void Main(string[] args)
            {
                F a = new F(Funktion);
                F b = Funktion;
            }
    

    Gruss
    foodax



  • Ich glaube das fällt unter das Stichwort "implicit method group conversion".

    Der Delegat-Typ wird wohl vom Compiler über die Signatur bestimmt und der Ausdruck mit einem "new" versehen.

    Bei events sieht man auch häufig
    eventobject -= new delegatetype(eventhandler);

    Finde ich eher verwirrend und ungeschickt gelöst. Man will etwas vorhandenes entfernen und instanziiert dafür ein neues Objekt. Hä?
    Liegt aber wohl daran, dass Methoden keine Identität haben.

    Wäre jedenfalls auch für eine Klarstellung dankbar 🙂


Anmelden zum Antworten