Temsilci bildirme, örneği oluşturma ve kullanma (C# Programlama Kılavuzu)

Aşağıdaki yöntemlerden herhangi birini kullanarak temsilcileri bildirebilirsiniz:

  • Temsilci türü bildirin ve eşleşen imzaya sahip bir yöntem bildirin:
// Declare a delegate.
delegate void NotifyCallback(string str);

// Declare a method with the same signature as the delegate.
static void Notify(string name)
{
    Console.WriteLine($"Notification received for: {name}");
}
// Create an instance of the delegate.
NotifyCallback del1 = new NotifyCallback(Notify);
  • Bir temsilci türüne yöntem grubu atayın:
// C# 2.0 provides a simpler way to declare an instance of NotifyCallback.
NotifyCallback del2 = Notify;
  • Anonim bir yöntem bildirin:
// Instantiate NotifyCallback by using an anonymous method.
NotifyCallback del3 = delegate(string name)
    { Console.WriteLine($"Notification received for: {name}"); };
  • Lambda ifadesi kullanın:
// Instantiate NotifyCallback by using a lambda expression.
NotifyCallback del4 = name =>  { Console.WriteLine($"Notification received for: {name}"); };

Daha fazla bilgi için bkz . Lambda İfadeleri.

Aşağıdaki örnekte temsilci bildirme, örnekleme ve kullanma işlemleri gösterilmektedir. sınıfı, BookDB kitap veritabanını tutan bir kitap deposu veritabanını kapsüller. Veritabanındaki tüm basılı kitapları bulan ve her biri için bir temsilci çağıran bir yöntemi ProcessPaperbackBookskullanıma sunar. delegate Kullanılan tür olarak adlandırılırProcessBookCallback. sınıfı, Test bu sınıfı kullanarak kağıt defterlerinin başlıklarını ve ortalama fiyatını yazdırır.

Temsilcilerin kullanılması, kitaplık veritabanı ile istemci kodu arasında iyi bir işlevsellik ayrımı sağlar. İstemci kodunda kitapların nasıl depolandığı veya kitapçı kodunun kağıt defterleri nasıl bulduğu hakkında hiçbir bilgisi yoktur. Kitapçı kodu, kitapçıyı bulduklarından sonra kağıt üzerinde hangi işlemlerin yapıldığı hakkında bilgi sahibi değildir.

Örnek

// 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 ProcessBookCallback(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(ProcessBookCallback 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 Test
    {
        // Print the title of the book.
        static void PrintTitle(Book b)
        {
            Console.WriteLine($"   {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:
            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);

            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
*/

Güçlü Programlama

  • Temsilci bildirme.

    Aşağıdaki deyim yeni bir temsilci türü bildirir.

    public delegate void ProcessBookCallback(Book book);
    

    Her temsilci türü, bağımsız değişkenlerin sayısını ve türlerini ve kapsülleyebileceği yöntemlerin dönüş değerini açıklar. Yeni bir bağımsız değişken türü kümesi veya dönüş değeri türü gerektiğinde, yeni bir temsilci türü bildirilmelidir.

  • Temsilci örneği oluşturma.

    Bir temsilci türü bildirildikten sonra, bir temsilci nesnesi oluşturulup belirli bir yöntemle ilişkilendirilmelidir. Önceki örnekte, aşağıdaki örnekte olduğu gibi yöntemini yöntemine ProcessPaperbackBooks geçirerek PrintTitle bunu yaparsınız:

    bookDB.ProcessPaperbackBooks(PrintTitle);
    

    Bu, statik yöntemiyle Test.PrintTitleilişkilendirilmiş yeni bir temsilci nesnesi oluşturur. Benzer şekilde, nesnedeki totaller statik olmayan yöntem AddBookToTotal aşağıdaki örnekte olduğu gibi geçirilir:

    bookDB.ProcessPaperbackBooks(totaller.AddBookToTotal);
    

    Her iki durumda da yöntemine ProcessPaperbackBooks yeni bir temsilci nesnesi geçirilir.

    Bir temsilci oluşturulduktan sonra, ilişkili olduğu yöntem hiçbir zaman değişmez; temsilci nesneleri sabittir.

  • Temsilci çağırma.

    Temsilci nesnesi oluşturulduktan sonra, temsilci nesnesi genellikle temsilciyi çağıracak diğer koda geçirilir. Temsilci nesnesi, temsilci nesnesinin adı kullanılarak çağrılır ve ardından temsilciye geçirilecek ayraçlı bağımsız değişkenler kullanılır. Aşağıda bir temsilci çağrısı örneği verilmiştir:

    processBook(b);
    

    Temsilci, bu örnekte olduğu gibi zaman uyumlu olarak veya ve EndInvoke yöntemleri kullanılarak BeginInvoke zaman uyumsuz olarak çağrılabilir.

Ayrıca bkz.