2009-05-18 14 views

Odpowiedz

123

Czy jesteś zaznajomiony z delegatów w ogóle? Mam stronę o delegates and events, która może pomóc, jeśli nie, chociaż jest bardziej nastawiona na wyjaśnienie różnic między tymi dwoma.

Func<T, TResult> jest tylko ogólna delegat - wypracować, co to znaczy w każdej konkretnej sytuacji przez zastąpienie parametrów typu (T i TResult) z odpowiednim argumentów typu (int i string) w deklaracji. Ja również przemianowano go, aby uniknąć nieporozumień:

string ExpandedFunc(int x) 

Innymi słowy, Func<int, string> jest delegatem, który reprezentuje funkcję bierze się int argument i przekazujących string.

Func<T, TResult> jest często używany w LINQ, zarówno dla prognoz i predykatów (w tym ostatnim przypadku, TResult jest zawsze bool). Na przykład można użyć obiektu Func<int, string> do wyświetlenia sekwencji liczb całkowitych w ciągi znaków. lambda wyrażenia są zwykle używane w LINQ do stworzenia odpowiednich delegatów:

Func<int, string> projection = x => "Value=" + x; 
int[] values = { 3, 7, 10 }; 
var strings = values.Select(projection); 

foreach (string s in strings) 
{ 
    Console.WriteLine(s); 
} 

Wynik:

Value=3 
Value=7 
Value=10 
+2

"Innymi słowy, jest to delegat, który reprezentuje funkcję pobierającą argument int i zwracającą ciąg znaków". Aby uniknąć nieporozumień u innych osób, wyjaśnię, że mówisz tutaj o Func , a nie o Func . Jest oczywiste, jeśli rozumiesz typy ogólne i delegatów, ale dla tych, którzy nie są Func , którzy mogą delegować do funkcji, która pobiera argument int i zwraca ciąg znaków. –

+0

Wyjaśnimy, kiedy wrócę na komputer później. –

+8

Downvoters: podaj powody ... –

22

Jest to delegat, który przyjmuje jeden parametr int jako parametr i zwraca wartość typu string.

Oto przykład jej użycia:

using System; 

class Program 
{ 
    static void Main() 
    { 
     Func<Int32, String> func = bar; 

     // now I have a delegate which 
     // I can invoke or pass to other 
     // methods. 
     func(1); 
    } 

    static String bar(Int32 value) 
    { 
     return value.ToString(); 
    } 
} 
+0

Dzięki andrew. Czy chciałeś napisać func (1) zamiast paska (1)? – zSynopsis

+1

Tak, zrobiłem!Dziękuję za poprawienie mnie! –

33

Func<int, string> zjada ints i zwraca ciągi. Więc, co je ints i zwraca łańcuchy? Co powiesz na to ...

public string IntAsString(int i) 
{ 
    return i.ToString(); 
} 

Tam właśnie wymyśliłem funkcję, która zjada ints i zwraca ciągi znaków. Jak tego użyć?

var lst = new List<int>() { 1, 2, 3, 4, 5 }; 
string str = String.Empty; 

foreach(int i in lst) 
{ 
    str += IntAsString(i); 
} 

// str will be "12345" 

Niezbyt seksowna, wiem, ale to prosty pomysł, na którym opiera się wiele sztuczek. Teraz zamiast tego użyjmy Func.

Func<int, string> fnc = IntAsString; 

foreach (int i in lst) 
{ 
    str += fnc(i); 
} 

// str will be "1234512345" assuming we have same str as before 

Zamiast wywoływać IntAsString na każdego członka, stworzyłem odniesienie do nazywany FNC (te odniesienia do metody nazywane są delegates) i że zamiast stosować. (Pamiętaj, fnc zjada ints i zwraca ciągi znaków).

Ten przykład nie jest bardzo sexy, ale mnóstwo sprytnych rzeczy, które zobaczysz, opiera się na prostym pomyśle funkcji, delegatów i extension methods.

Jednym z najlepszych primerów w tych rzeczach, które widziałem jest here. Ma o wiele więcej prawdziwych przykładów. :)

+4

Podoba mi się to wyjaśnienie –

+0

@Therealnapster też to lubię, ale bardziej lubię twoje imię. – BKSpurgeon