2009-11-17 91 views
16

像匿名方法一樣,我使用「委託」關鍵字聲明的委託是匿名委託?C# - 匿名委託

namespace Test 
{ 
    public delegate void MyDelegate(); 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DelegateTest tst = new DelegateTest(); 
      tst.Chaining(); 
      Console.ReadKey(true); 
     } 
    } 

    class DelegateTest 
    { 
     public event MyDelegate del; 

     public void Chaining() 
     { 
      del += delegate { Console.WriteLine("Hello World"); }; 
      del += delegate { Console.WriteLine("Good Things"); }; 
      del += delegate { Console.WriteLine("Wonderful World"); }; 
      del(); 
     } 
    } 
} 

回答

2

是的。匿名代表不能通過名字直接引用,因此使用delegate(){}語法意味着它們是匿名的。

1

他們委託給匿名方法。這是製作匿名方法的一種方法,自.NET 2.0起可用。使用.NET 3.0,您還可以使用更容易編寫的lambda表達式(但編譯爲相同的代碼)。我想這就是你所說的「匿名方法」。但是,真的,他們是同一件事。

+0

Lambda表達式和lambda語法中的匿名方法並不相同。如果您使用帶花括號的lambda語法,則您的語句爲true:(x)=> {y();} – Lucero 2009-11-17 13:07:27

4

這是正確的,您已將一些匿名方法分配給事件。

如果您使用的是更新版本的c#,您也可以使用lambdas做類似的事情。例如:

class DelegateTest 
{ 
    public event Action del; 

    public void Chaining() 
    { 
     del +=() => Console.WriteLine("Hello World"); 
     del +=() => Console.WriteLine("Good Things"); 
     del +=() => Console.WriteLine("Wonderful World"); 
     del(); 
    } 
} 
+2

您的意思是C#3.0嗎? – user160677 2009-11-17 13:09:28

23

有沒有這樣的事,作爲一個「匿名委託」(或者更確切地說,這不是在C#規範認可的術語,或任何其他.NET相關的規範我所知道的)。

有匿名函數,其中包括匿名方法和lambda表達式。

您的代碼顯示普通的舊的匿名方法 - 雖然他們使用一個功能lambda表達式沒有:當你不關心它們時不能表達參數的能力。

+0

嗯。你能澄清這一點嗎..我們通常會看到「匿名代表」這個詞在MSDN中使用的術語「匿名方法」中使用,所以我們說前者或兩者都是錯誤的。 – 2011-02-24 09:54:11

+0

@Shekhar_Pro:「Anonymous方法「是正確的。 「匿名代表」不正​​確。你說你「經常在任何地方看到它」 - 你能否引用特定的地方? – 2011-02-24 10:14:55

+0

不在任何官方文檔中,但是網民使用的常用術語。像... SO本身.. http://stackoverflow.com/search?q=anonymous+delegate ....所以看起來像我們已經習慣於使用錯誤的術語。 – 2011-02-24 10:22:27

2

您的代表不是匿名的。它被稱爲MyDelegate。 CLR中的委託是一個派生自System.MulticastDelegate的類,在你的情況下它叫做MyDelegate。 你不能直接從MulticastDelegate派生,C#編譯器會阻止你。

在您的代碼中,當您將委託分配給del時,委託的類型/名稱由編譯器推斷,因爲您將del聲明爲MyDelegate類型的事件。