2013-08-28 15 views
17

Daha önce sorulması gereken bu soru olabilir, googling yaptım ama cevap alamadım. objDel2("test"); ve objDel2.Invoke("Invoke"); kodlamaHerhangi bir fark var Invoke Yöntemi (Temsilci) ve doğrudan çağrı?

Delege Prototip

delegate void method1(string str); 

ekleme Geri arama yöntemleri Üstü yılında

method1 objDel2;   
objDel2 = new method1(TestMethod1);    
objDel2("test"); 
objDel2.Invoke("Invoke"); 

aynı task.Which birini yapıyoruz iyidir ya da her ikisi aynıdır.

+1

Eğer bjDel2 ("test") 'soran Are (***HERE*** olarak benim damgasını iki yer bakınız) yapmak;' ve 'objDel2.Invoke ("Invoke"); 'aynı mı? Evet onlar. Yoksa hangisinin tercih edilmesini istiyorsun? Bu öncelikle fikir temelli. – dtb

+0

Onun tek ve aynı bir fark sadece – Rohit

cevap

31

Bunlar% 100 özdeştir - bu saf derleyici şekeridir (aşağıya bakınız). Hangi için tercih edilir: ne/her ikisi de.

static class Program { 

    static void Main() 
    { 
     method1 objDel2; 
     objDel2 = new method1(TestMethod1); 
     objDel2("test"); 
     objDel2.Invoke("Invoke"); 
    } 
    delegate void method1(string val); 
    static void TestMethod1(string val) { 
     System.Console.WriteLine(val); 
    } 
} 

Il

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    .maxstack 2 
    .locals init (
     [0] class Program/method1 'method') 
    L_0000: ldnull 
    L_0001: ldftn void Program::TestMethod1(string) 
    L_0007: newobj instance void Program/method1::.ctor(object, native int) 
    L_000c: stloc.0 
    L_000d: ldloc.0 
    L_000e: ldstr "test" 
    L_0013: callvirt instance void Program/method1::Invoke(string) ***HERE*** 
    L_0018: ldloc.0 
    L_0019: ldstr "Invoke" 
    L_001e: callvirt instance void Program/method1::Invoke(string) ***HERE*** 
    L_0023: ret 
} 

Not vardır her ikisi de aynı şeyi

+0

Invoke' olan bir avantajı, gerekli boş çek önlemek için boş yayılma operatörünü kullanabilirsiniz 'kullanarak C# 6'da –

+6

... Cevap için teşekkür ederiz açıkça çağırmak çağırıyor:' objDel2 .Invoke ("öne"); '. ? Sen 'objDel2 ("test") yazamıyor;' –

+1

@TimSchmelter yup, ve bunu IL kodu almak nerede üçlü –

İlgili konular