2016-04-02 113 views
1

我在學習代表。 我簡單地寫2個函數返回每個字符串,然後我隱藏這樣一個委託中:C#代表隱藏

delegate string PrinterDelegate(); 
class Printer 
{ 
    public PrinterDelegate BlackColor = PrintBlackColor; 
    public PrinterDelegate Color = PrintColor; 

    private static string PrintBlackColor() 
    { 
     return "Printing black color"; 
    } 
    private static string PrintColor() 
    { 
     return "Printing with color"; 
    } 

    public string Returner(Func<string> func) 
    { 
     return func(); 
    } 
} 

(我會說什麼武者回歸是後我會問我的問題) 所以看起來的Program.cs像這樣:

Printer printer = new Printer(); 
Func<string> mainPrinter =() => { return printer.BlackColor(); }; 
string totogate = printer.Returner(mainPrinter); 
Console.WriteLine(totogate); 

,當然我得到:
在控制檯中的「打印黑色」。
現在我無法理解這是什麼行:

Func<string> mainPrinter =() => { return printer.BlackColor(); }; 

什麼意思返回名爲mainPrinter下BlackColor PrinterDelegate這是Func鍵? mainPrinter持有什麼?
當我將mainPrinter傳入到了Returner中時,它返回字符串名稱totogate是什麼?
我知道它會返回「打印黑色」,但如何?
究竟發生了什麼?

回答

1

其分解:

Func<string> mainPrinter =() => { return printer.BlackColor(); }; 
  • Func<string> mainPrinter聲明瞭類型Func<string>
  • =分配給它誒值() => { return printer.BlackColor(); }
  • () => { return printer.BlackColor(); }是最有趣的部分是lambda語法聲明一個變量一個不帶參數的匿名函數會返回一個字符串。編譯器查看return語句來推斷它的返回類型。

總而言之,聲明爲沒有返回字符串參數的函數聲明一個委託(參見Func<TResult>)。該委託被分配到一個對名爲{return printer.BlackColor;}的匿名函數的引用。

+0

因此,在短期,Func鍵是接受我的情況下返回字符串類型和功能的委託,我又回到printer.BlackColor這實際上是返回類型字符串的函數PrintBlackColor,現在mainPrinter成立。當然,我將它傳遞給了Returner,func()當然也指向PrintBlackColor。假設我寫的內容沒有錯,我很感激。 – N3wbie

+0

賓果!把它在一個。 – WyomingDoug

0

你告訴:

我學習的代表。

好,這是函數功能<字符串的特定>:

public delegate TResult Func<out TResult>(); 

沒錯,func被委託。因此,從MSDN開始:

委託是一種類型,它表示對具有特定參數列表和返回類型的方法的引用。

你的Func表示對沒有參數列表的方法的引用並返回一個字符串。 可以認爲像可存儲FUNC代替int或字符串的變量:

Func<string> mainPrinter =() => { return printer.BlackColor(); }; 

mainPrinter是存儲函數的變量,()=> {返回printer.BlackColor(); }函數。

所以,就像讀一int變量,可以執行函數求變量;-)