C'è qualche ragione per usare un Func su un metodo?

7

Recentemente ho appena iniziato a guardare Func in C # e, per quanto posso dire, sono praticamente uguali ai metodi, il che è abbastanza giusto. Tuttavia, mi stavo chiedendo se non abbia senso usarli, perché, per quanto posso dire, sembrano essere solo una versione leggermente meno di metodi. Considera quanto segue:

Func<int,int> SquareTheNumber = x => { return x * x };
public int ReturnTheSquare (int x)
{
    return x * x;
}

Quindi c'è qualche istanza in cui un Func dovrebbe essere usato su un metodo?

    
posta Danny Goodall 11.05.2016 - 10:46
fonte

2 risposte

14

Un Func è solo un tipo speciale di (ben una famiglia di, davvero) delegato. Naturalmente, C # sarebbe completo, anche senza di loro, quindi ovviamente nessuno li "ha bisogno" di loro, è solo che fanno un sacco di cose MOLTO più semplice design e sintassi-saggio.

Assumono un ruolo simile ai puntatori di funzioni in linguaggi come C. È fondamentalmente un modo per separarti da un metodo specifico e dipendono invece da una classe polimorfica ("classe" in un senso non OOP) di metodi.

Un esempio piuttosto semplice quando sono utili è il metodo map nel funcion IEnumerable<T> (chiamato Select in C #):

public static IEnumerable<TResult> Select<T, TResult>(this IEnumerable<T> xs, Func<T, TResult> f)
{
    foreach (var x in xs) yield return f(x);
}

Ora può essere richiamato tramite new[] {1,2,3}.Select(x => x*2) invece di definire un'interfaccia one-method som e creare un'intera classe solo per moltiplicare un numero per 2.

Denominare e posizionare esplicitamente ogni piccolo lambda in una classe in un namespace farebbe solo gonfiare le cose e non aggiungere chiarezza.

    
risposta data 11.05.2016 - 11:10
fonte
5

I recently just started looking at Func in C#, and as far as I can tell, they pretty much are the same as methods, which is fair enough.

Func s (e Action s) sono oggetti. I metodi non lo sono.

In un linguaggio orientato agli oggetti, dove tutto ciò che fai è fatto manipolando, costruendo, passando, restituendo e immagazzinando oggetti, qualcosa non essendo un oggetto è estremamente restrizione grave. Quindi, no, sono non "più o meno lo stesso", sono in effetti fondamentalmente diversi. In un certo senso, non potrebbero essere più diversi.

  • Puoi passare un Func come argomento. Non puoi farlo con un metodo, perché puoi passare solo oggetti come argomenti e i metodi non sono oggetti.
  • Puoi restituire un Func . Non puoi farlo con un metodo, perché puoi solo restituire oggetti e i metodi non sono oggetti.
  • Puoi assegnare Func a una variabile. Non puoi farlo con un metodo, perché puoi solo assegnare oggetti alle variabili e i metodi non sono oggetti.
  • È possibile costruire un Func in fase di runtime. Non puoi farlo con un metodo.

[Sto ignorando la riflessione qui. Sto anche ignorando la conversione automatica dai riferimenti dei gruppi di metodi ai delegati.]

    
risposta data 11.05.2016 - 13:11
fonte

Leggi altre domande sui tag