Come lavorare con i delegati Action, Func e Predicate in C #

Un delegato è un puntatore a funzione indipendente dai tipi che può fare riferimento a un metodo che ha la stessa firma di quello del delegato. I delegati vengono utilizzati per definire metodi di callback e implementare la gestione degli eventi e vengono dichiarati utilizzando la parola chiave "delegate". È possibile dichiarare un delegato che può apparire da solo o addirittura annidato all'interno di una classe.

Cosa sono i delegati Func e Action? Come possono essere utilizzati?

La differenza fondamentale tra i delegati Func e Action è che mentre il primo viene utilizzato per i delegati che restituiscono valore, il secondo può essere utilizzato per quei delegati in cui non si dispone di alcun valore restituito.

Func è un delegato che punta a un metodo che accetta uno o più argomenti e restituisce un valore. L'azione è un delegato che punta a un metodo che a sua volta accetta uno o più argomenti ma non restituisce alcun valore. In altre parole, dovresti usare Action quando il tuo delegato punta a un metodo che restituisce void.

Un predicato è un delegato che accetta uno o più parametri generici e restituisce un valore booleano: si può presumere che sia qualcosa come Func. I delegati predicati vengono in genere utilizzati per eseguire operazioni di ricerca su alcuni dati in base a una serie di criteri.

Programmazione dei delegati dell'azione in C #

È possibile sfruttare i delegati in C # per implementare eventi e richiamare metodi. Un delegato in C # è simile ai puntatori a funzione di C ++, ma i delegati C # sono indipendenti dai tipi. È possibile passare metodi come parametri a un delegato per consentire al delegato di puntare al metodo.

Il frammento di codice seguente illustra la sintassi per l'utilizzo di Action delegate.

Azione

Il listato di codice seguente mostra come utilizzare Action delegate. Questo frammento di codice, una volta eseguito, stamperà la parola "Hello !!!" nella finestra della console.

static void Main (string [] args)

        {

            Azione azione = nuova azione (display);

            azione ("Ciao !!!");

            Console.Read ();

        }

static void Display (stringa messaggio)

        {

            Console.WriteLine (messaggio);

        }

Delegati di funzioni di programmazione in C #

Vediamo ora come possiamo lavorare con i delegati Func in C #. Ecco la sintassi per un delegato Func.

Func

Il frammento di codice seguente illustra come usare un delegato Func in C #. Stampa il valore di Hra (calcolato come il 40% dello stipendio base). Lo stipendio base viene trasferito come argomento.

static void Main (string [] args)

        {

            Func func = new Func (CalculateHra);

            Console.WriteLine (func (50000));

            Console.Read ();

        }

        static double CalculateHra (int basic)

        {

            ritorno (doppio) (base * .4);

        }

Si noti che il secondo parametro nella dichiarazione del delegato Func nel frammento di codice fornito in precedenza rappresenta il tipo restituito del metodo a cui punta il delegato. In questo esempio, il valore Hra calcolato viene restituito come double.

Programmazione delegati predicato in C #

Un delegato Predicate viene in genere utilizzato per cercare elementi in una raccolta o in un insieme di dati. Ecco la sintassi per un delegato Predicate.

Predicato

Nota che Predicate è fondamentalmente equivalente a Func.

Considera la seguente classe di entità denominata Customer.

cliente di classe

    {

        public int Id {get; impostato; }

        stringa pubblica FirstName {get; impostato; }

        stringa pubblica LastName {get; impostato; }

        stringa pubblica Indirizzo {get; impostato; }

        stringa pubblica City {get; impostato; }

        public string State {get; impostato; }

        stringa pubblica Paese {get; impostato; }

    }

Successivamente, crea un elenco di clienti e memorizza gli oggetti di tipo Cliente al suo interno.

 List custList = new List ();

            custList.Add (nuovo cliente {Id = 1, FirstName = "Joydip", LastName = "Kanjilal", State = "Telengana", City = "Hyderabad", Address = "Begumpet", Country = "India"});

            custList.Add (nuovo cliente {Id = 2, FirstName = "Steve", LastName = "Jones", State = "OA", City = "New York", Address = "Lake Avenue", Country = "US"}) ;

Di seguito è riportato l'elenco completo del codice che mostra come è possibile utilizzare un delegato Predicate per la ricerca dei dati.

static void Main(string[] args)

        {

            List custList = new List();

            custList.Add(new Customer { Id = 1, FirstName = "Joydip", LastName = "Kanjilal", State = "Telengana", City = "Hyderabad", Address = "Begumpet", Country = "India" });

            custList.Add(new Customer { Id = 2, FirstName = "Steve", LastName = "Jones", State = "OA", City = "New York", Address = "Lake Avenue", Country = "US" });

            Predicate hydCustomers = x => x.Id == 1;

            Customer customer = custList.Find(hydCustomers);

            Console.WriteLine(customer.FirstName);

            Console.Read();

        }

When the above code snippet is executed, the name “Joydip” will be displayed in the console window.

Come fare di più in C #:

  • Quando usare una classe astratta e un'interfaccia in C #
  • Come lavorare con AutoMapper in C #
  • Come usare le espressioni lambda in C #
  • Come lavorare con i delegati Action, Func e Predicate in C #
  • Come lavorare con i delegati in C #
  • Come implementare un semplice logger in C #
  • Come lavorare con gli attributi in C #
  • Come lavorare con log4net in C #
  • Come implementare il modello di progettazione del repository in C #
  • Come lavorare con la riflessione in C #
  • Come lavorare con Filesystemwatcher in C #
  • Come eseguire l'inizializzazione pigra in C #
  • Come lavorare con MSMQ in C #
  • Come lavorare con i metodi di estensione in C #
  • Come utilizzare espressioni lambda in C #
  • Quando usare la parola chiave volatile in C #
  • Come utilizzare la parola chiave yield in C #
  • Come implementare il polimorfismo in C #
  • Come creare il proprio pianificatore di attività in C #
  • Come lavorare con RabbitMQ in C #
  • Come lavorare con una tupla in C #
  • Esplorazione di metodi virtuali e astratti in C #