I Just non riesco a avvolgere la mia mente intorno a loro.I funzionamenti quando dovrei usarli che cosa è il loro uso previsto
Come ho capito, aggiunge in modo dinamico la logica a una classe. Le classi all'interno del quadro sono preparate per questo?
Perché dovrei semplicemente estendere la classe e aggiungervi la funzionalità nell'estensione. Sarei accessibile a livello globale e molto più facile da mantenere.
che ho letto ci sono 4 tipi funtore:
Comparer
Chiusura
predicato
Transformer
probabilmente dovremmo gestire ogni uno di loro.
p.s. c'è qualcosa di simile in VB?
Quindi posso affermare che penso che le espressioni lambda siano funtori. Questo chiarisce le cose per me un po ':) (hehe)
- Le espressioni lambda sono funtori?
- Le funzioni anonime sono funtori?
Ma ho fatto questa domanda perché mi sono imbattuto in un altro tipo di fucntors cioè questi:
delegate void FunctorDelegate(int value);
class Addition {
FunctorDelegate _delegate;
public Addition AddDelegate(FunctorDelegate deleg) {
_delegate += deleg;
return this;
}
public int AddAllElements(IList< int> list) {
int runningTotal = 0;
foreach(int value in list) {
runningTotal += value;
_delegate(value);
}
return runningTotal;
}
}
e quindi chiamando con questo:
int runningTotal = new Addition()
.AddDelegate(new FunctorDelegate(
delegate(int value) {
if ((value % 2) == 1) {
runningOddTotal += value;
}
}))
.AddDelegate(new FunctorDelegate(
delegate(int value) {
if ((value % 2) == 0) {
runningEvenTotal += value;
}
}))
.AddAllElements(list);
Quindi niente cose stile lambda di fantasia .
Ora ho questo esempio ma non è del tutto chiaro perché questa è una soluzione "buona".
I delegati (funtori) vengono utilizzati come espressioni lambda o metodi anonimi "nella maggior parte dei casi" solo lì come scorciatoia per il programmatore? Ci sono per quanto posso vedere solo in alcuni casi in cui sono in realtà la scelta preferita per un problema.
(risposto al commento) –
Sono propenso a dire che * non è * una buona soluzione; forse stavano cercando di mostrare * l'uso potenziale *, piuttosto che l'uso tipico. L'unica cosa "carina" (e sono generoso qui) su quel codice è che enumera solo una volta i dati - ma ci sono altre risposte a questo. Ad esempio, PushLINQ (MiscUtil) consente più aggregazioni su un feed di dati "solo una volta" con (IMO) molta più eleganza. –
hehe questo codice era per mostrare il suo potenziale utilizzo ma ha fatto anche un brutto lavoro in questo :). L'ho postato per spiegare il "altro" tipo di funtore (methos anonimo) in cui mi sono imbattuto. Ma non era/non è chiaro dove nella mia vita quotidiana questa sarebbe diventata la "LA" soluzione. Fredrik ne ha parlato un po '. – albertjan