2016-04-02 21 views
1

Delegeleri öğreniyorum. Ben sadece her bir dize döndürür ve sonra ben böyle bir temsilci içeride bunları gizlemek 2 fonksiyonlarını yazma:C# delegeleri gizleniyor

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(); 
    } 
} 

(I returner benim soru soracaktır sonra ne diyecekler) böylece program.cs görünüyor böyle:

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

ve tabii i olsun:
konsolunda "siyah renk basımı".

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

o Func olduğunu mainPrinter altında BlackColor adlı bir PrinterDelegate dönmek için ne anlama gelir:
Şimdi bu çizgi ne i anlamak mümkün değilim mı? mainPrinter ne tutuyor?
ve mainPrinter'ı Returner'a aktardığımda, dize adı totogate'e geri dönen nedir?
"Siyah renkli yazdırma" ifadesini döndüreceğini biliyorum, ama nasıl?
Tam olarak ne olur?

cevap

1

aşağı Breaking:

Func<string> mainPrinter =() => { return printer.BlackColor(); }; 
  • Func<string> mainPrinterFunc<string>
  • =() => { return printer.BlackColor(); }
  • () => { return printer.BlackColor(); } ilginç parçasıdır ha değerini atar ve ilan etmek lambda sözdizimi türüne sahip bir değişken bildirir argüman almayan anonim bir işlev bir dizge döndürür. Derleyici, dönüş türünü bulmak için dönüş ifadesine bakar.

Tamamıyla ifade, bir dize döndüren argüman içermeyen bir işlev için bir temsilci bildirir (bkz. Func<TResult>). Temsilci, {return printer.BlackColor;} olarak bildirilen anonim işleve bir başvuru olarak atanır.

+0

yürütebileceği, Func dönüş dize türünde ve benim durumumda işlevi kabul eden bir temsilci, ı printer.BlackColor döndü aslında mainPrinter'ın sahip olduğu dönüş türü dizgenin PrintBlackColor işlevidir. Tabii ki Returner'a geçiyorum ve func() elbette PrintBlackColor'a da değiniyor! Yazdıklarımın yanlış olmadığını varsayarak minnettarım. – N3wbie

+0

Bingo! Birinde aldım. – WyomingDoug

0

Sen anlattı: Ben temsilci'ı öğreniyorum

.

Tamam

ve bu Func < dize özgüdür>:

public delegate TResult Func<out TResult>(); 

Kesinlikle, Func bir Delegesi'dir. Bu nedenle, MSDN:

Bir temsilci, belirli bir parametre listesi ve dönüş türüne sahip yöntemlere başvuruları temsil eden bir türdür.

Func'iniz, parametre listesi olmayan ve dize döndüren yöntemlere yapılan bir başvuruyu temsil eder.) (,

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

mainPrinter bir fonksiyon kaydetmek bir değişkendir => {printer.BlackColor() return;: yerine int veya dize bir fonk saklayabilen değişken gibi düşünebiliriz işlev.

Yani, böyle bir int değişkeni okumak, bir Func değişkeni ;-) Yani kısacası