Udostępnij za pośrednictwem


Jak: zadeklarować, wystąpienia i używać delegata (Podręcznik programowania C#)

C# 1.0 i później może być deklarowana delegatów, jak pokazano w poniższym przykładzie.

// Declare a delegate.
delegate void Del(string str);

// Declare a method with the same signature as the delegate.
static void Notify(string name)
{
    Console.WriteLine("Notification received for: {0}", name);
}
// Create an instance of the delegate.
Del del1 = new Del(Notify);

C# 2.0 zapewnia prostszym sposobem napisania poprzedniej deklaracji, jak pokazano w poniższym przykładzie.

// C# 2.0 provides a simpler way to declare an instance of Del.
Del del2 = Notify;

W języku C# 2.0 i nowszych, jest również możliwe przy użyciu metody anonimowej oświadczają i zainicjować delegować, jak pokazano w poniższym przykładzie.

// Instantiate Del by using an anonymous method.
Del del3 = delegate(string name)
    { Console.WriteLine("Notification received for: {0}", name); };

W C# 3.0 lub nowszej delegatów również można zgłoszone i utworzyć wystąpienia przy użyciu wyrażenia lambda, jak pokazano w poniższym przykładzie.

// Instantiate Del by using a lambda expression.
Del del4 = name =>  { Console.WriteLine("Notification received for: {0}", name); };

Aby uzyskać więcej informacji, zobacz Wyrażenia lambda (Podręcznik programowania C#).

Poniższy przykład ilustruje deklarowania, utworzenie wystąpienia i za pomocą obiektu delegowanego.BookDB Klasy hermetyzuje księgarni bazy danych, która utrzymuje bazę danych książek.Prezentuje ona metody, ProcessPaperbackBooks, która znajdzie wszystkie paperback książki w bazie danych i wywołania obiektu delegowanego dla każdego z nich.delegate o nazwie typu używanej ProcessBookDelegate.Test Klasy używa tej klasy, aby wydrukować tytuły i średnia cena papierowej książki.

Użycie delegatów promuje dobrego oddzielenia funkcji między bazą danych księgarni i kod klienta.Kod klienta nie ma żadnych informacji na temat sposobu przechowywania książek lub jak kod księgarni znajdzie papierowej książki.Kod księgarni znany jakie przetwarzanie odbywa się na papierowej książki, po ich znajdzie.

Przykład

// A set of classes for handling a bookstore:
namespace Bookstore
{
    using System.Collections;

    // Describes a book in the book list:
    public struct Book
    {
        public string Title;        // Title of the book.
        public string Author;       // Author of the book.
        public decimal Price;       // Price of the book.
        public bool Paperback;      // Is it paperback?

        public Book(string title, string author, decimal price, bool paperBack)
        {
            Title = title;
            Author = author;
            Price = price;
            Paperback = paperBack;
        }
    }

    // Declare a delegate type for processing a book:
    public delegate void ProcessBookDelegate(Book book);

    // Maintains a book database.
    public class BookDB
    {
        // List of all books in the database:
        ArrayList list = new ArrayList();

        // Add a book to the database:
        public void AddBook(string title, string author, decimal price, bool paperBack)
        {
            list.Add(new Book(title, author, price, paperBack));
        }

        // Call a passed-in delegate on each paperback book to process it: 
        public void ProcessPaperbackBooks(ProcessBookDelegate processBook)
        {
            foreach (Book b in list)
            {
                if (b.Paperback)
                    // Calling the delegate:
                    processBook(b);
            }
        }
    }
}


// Using the Bookstore classes:
namespace BookTestClient
{
    using Bookstore;

    // Class to total and average prices of books:
    class PriceTotaller
    {
        int countBooks = 0;
        decimal priceBooks = 0.0m;

        internal void AddBookToTotal(Book book)
        {
            countBooks += 1;
            priceBooks += book.Price;
        }

        internal decimal AveragePrice()
        {
            return priceBooks / countBooks;
        }
    }

    // Class to test the book database:
    class TestBookDB
    {
        // Print the title of the book.
        static void PrintTitle(Book b)
        {
            System.Console.WriteLine("   {0}", b.Title);
        }

        // Execution starts here.
        static void Main()
        {
            BookDB bookDB = new BookDB();

            // Initialize the database with some books:
            AddBooks(bookDB);

            // Print all the titles of paperbacks:
            System.Console.WriteLine("Paperback Book Titles:");

            // Create a new delegate object associated with the static 
            // method Test.PrintTitle:
            bookDB.ProcessPaperbackBooks(PrintTitle);

            // Get the average price of a paperback by using
            // a PriceTotaller object:
            PriceTotaller totaller = new PriceTotaller();

            // Create a new delegate object associated with the nonstatic 
            // method AddBookToTotal on the object totaller:
            bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);

            System.Console.WriteLine("Average Paperback Book Price: ${0:#.##}",
                    totaller.AveragePrice());
        }

        // Initialize the book database with some test books:
        static void AddBooks(BookDB bookDB)
        {
            bookDB.AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M. Ritchie", 19.95m, true);
            bookDB.AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95m, true);
            bookDB.AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95m, false);
            bookDB.AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00m, true);
        }
    }
}
/* Output:
Paperback Book Titles:
   The C Programming Language
   The Unicode Standard 2.0
   Dogbert's Clues for the Clueless
Average Paperback Book Price: $23.97
*/

Stabilne programowanie

  • Deklarowanie pełnomocnika.

    Poniższa instrukcja deklaruje typem obiektu delegowanego.

    public delegate void ProcessBookDelegate(Book book);
    

    Każdy typ obiektu delegowanego opisuje liczbę i typy argumentów i typ zwracanej wartości metod można hermetyzujące.W każdym przypadku, gdy potrzebna jest nowy zestaw typów argumentu lub zwracanej wartości typu, musi być zadeklarowany nowy typ obiektu delegowanego.

  • Utworzenie wystąpienia obiektu delegowanego.

    Po typem obiektu delegowanego został zadeklarowany, obiekt pełnomocnik musi być utworzony i skojarzone z określoną metodę.W poprzednim przykładzie, można to zrobić, przekazując PrintTitle metoda ProcessPaperbackBooks metody, jak w poniższym przykładzie:

    bookDB.ProcessPaperbackBooks(PrintTitle);
    

    Spowoduje to utworzenie nowego obiektu delegata skojarzonych z statyczne metoda Test.PrintTitle.Podobnie, metody statyczne nie AddBookToTotal w obiekcie totaller jest przekazywana jak w poniższym przykładzie:

    bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);
    

    W obu przypadkach nowy obiekt delegata jest przekazywany do ProcessPaperbackBooks metody.

    Po utworzeniu obiektu delegowanego metoda jest skojarzony z nigdy nie zmiany; Pełnomocnik obiekty są niezmienne.

  • Wywołanie obiektu delegowanego.

    Po utworzeniu obiektu delegata obiekt delegata zazwyczaj jest przekazywany do innego kodu, który będzie wywoływać pełnomocnika.Obiekt delegata nazywa się przy użyciu nazwy obiektu pełnomocnika, następuje ujętego w nawiasy argumenty przekazywane do pełnomocnika.Oto przykład wywołania obiektu delegowanego:

    processBook(b);
    

    Pełnomocnik może być albo nazywane synchronicznie, jak w poniższym przykładzie, lub asynchronicznie za pomocą BeginInvoke i EndInvoke metody.

Zobacz też

Informacje

Zdarzenia (Podręcznik programowania C#)

Pełnomocnicy (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#