2012-05-22 25 views
2
using System; 

public delegate void Printer(string s); 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     Printer p = new Printer(delegate {}); 
     p+= myPrint; 
     p("Hello"); 
     Console.ReadKey(true); 
    } 

    public static void myPrint(string s) 
    { 
     System.Console.WriteLine(s); 
    } 
} 

看起來好像我必須初始化具有空匿名函數的委託才能在稍後使用+=。當我省略new子句時,p變爲null+=不起作用,這是有道理的。類內代表的默認值

現在,當我有一類與委託實例,我可以做到以下幾點:

using System; 

public delegate void Printer(string s); 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     A a = new A(); 
     a.p += myPrint; 
     a.p("Hello"); 
     Console.ReadKey(true); 
    } 

    public static void myPrint(string s) 
    { 
     System.Console.WriteLine(s); 
    } 
} 


class A { 
    public Printer p; 
} 

爲什麼這可以嗎?代理實例p有沒有默認值?它不能是null,因爲那樣我就不能使用+=爲它分配一個新的回調。我試圖用關鍵字"default value for delegates"來搜索這個問題,但什麼都沒發現。另外,如果問題太簡單,對不起。

感謝您的幫助!

回答

6

代表是參考類型,所以默認值是null

然而,變量(不像字段)默認情況下未初始化:

Printer p; 
p += myPrint; // doesn't work: uninitialized variable 

需要初始化變量,然後才能使用它:

Printer p = null; 
p += myPrint; 

Printer p; 
p = null; 
p += myPrint; 

請注意,對於代表(但不是事件!)

p += myPrint; 

p = (Printer)Delegate.Combine(p, new Printer(myPrint)); 
+0

所以簡寫,它畢竟空。該死的。 – Kalevi

+0

您也可以使用'p = myPrint'。 –

+0

你也可以使用'p = p + myPrint;'或'p = myPrint + p;',即使'p'是一個(類似於字段的)事件,這也可以工作(而不是線程安全的)由相同的類/結構。當'p'是由這個類/結構定義的事件時,'+ ='的語義在C#4(2010)中進行了更改。 –