2016-04-02 111 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变量,可以执行函数求变量;-)