2010-02-02 12 views
9

Basit bir sorum var: bir C# temsilcisinin işlev referansını geçmenin aksine avantajı nedir? Demek istediğim:C# Delegate Instantiation ve Sadece Metot Referansını Geçme

Neden:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 

Yapabileceğiniz:

Thread t = new Thread(SomeObject.SomeMethod); 

Hem derlemek ve iş benim durumumda olacak ... ben eksik bir şey?

+0

olası yinelenen [Yeni Eylem() ve bir lambda arasındaki fark nedir?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal

cevap

6

SomeObject.SomeMethod yöntem grubu, void türünde bir dönüşüme sahip olduğu ve hiçbir parametrenin olmadığı sürece hiçbir fark yoktur. Bunun nedeni, ThreadStart'un void değerini döndüren delegate olarak tanımlanması ve hiçbir parametre almamasıdır ve bu nedenle SomeObject.SomeMethodThreadStart yöntem grubundan örtük bir dönüşüm vardır. Bu nedenle, her ikisi de Thread yapıcısının Thread(ThreadStart) yüklenmesini başlatıyor.

Dil belirtiminin ilgili bölümü §6.6'dır (Yöntem grubu dönüşümleri).

Basit bir sorum var: bir C# temsilcisini, yalnızca işlev başvurusu geçirmenin tersine başlatmanın avantajı nedir? Bu nedenle, burada sadece bir terminoloji düzeltmesi var.

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

ile someObject.SomeMethod ile gösterilen şey yöntem grubudur. Bunu sadece someObject.SomeMethod notasyonu kullanarak bakabilecek aşırı yüklü yöntemler kümesi olarak düşünebilirsiniz.

+1

'someObject.SomeMethod()' da bir yöntem grubu mu? –

+1

@John Feminella: Hayır, bu bir yöntem çağrısı olur. – jason

+0

Hmm, tamam. Ya “SomeMethod” un, “SomeMethod (...)” ile eşleştiği ve “...” nin keyfi parametreler olduğu birkaç aşırı yüklenme varsa? O zaman bir yöntem grubu mu, çünkü birkaç yöntemden birine başvurabilir ve henüz çözülmemiş midir? –

4

Derleyici, daha kısa kodu yazdığınızda, daha uzun bir kod anlamına geleceğini görecektir. Nihai etkide fark yoktur. Tam kurucunun netliğini istiyorsanız, onu koyabilirsiniz; Sadece yöntem grubunun kısalmasını istiyorsanız, derleyicinin yapıcıyı bulmasına izin verebilirsiniz. Bu sadece stilistik bir seçim.