Делегаты (Руководство по программированию на C#)Delegates (C# Programming Guide)

Делегат — это тип, который представляет ссылки на методы с определенным списком параметров и типом возвращаемого значения.A delegate is a type that represents references to methods with a particular parameter list and return type. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвращаемого значения.When you instantiate a delegate, you can associate its instance with any method with a compatible signature and return type. Метод можно вызвать (активировать) с помощью экземпляра делегата.You can invoke (or call) the method through the delegate instance.

Делегаты используются для передачи методов в качестве аргументов к другим методам.Delegates are used to pass methods as arguments to other methods. Обработчики событий — это ничто иное, как методы, вызываемые с помощью делегатов.Event handlers are nothing more than methods that are invoked through delegates. При создании пользовательского метода класс (например, элемент управления Windows) может вызывать этот метод при появлении определенного события.You create a custom method, and a class such as a windows control can call your method when a certain event occurs. В следующем примере показано объявление делегата:The following example shows a delegate declaration:

public delegate int PerformCalculation(int x, int y);

Делегату можно назначить любой метод из любого доступного класса или структуры, соответствующей типу делегата.Any method from any accessible class or struct that matches the delegate type can be assigned to the delegate. Этот метод должен быть статическим методом или методом экземпляра.The method can be either static or an instance method. Это позволяет программно изменять вызовы метода, а также включать новый код в существующие классы.This makes it possible to programmatically change method calls, and also plug new code into existing classes.

Примечание

В контексте перегрузки метода его сигнатура не содержит возвращаемое значение.In the context of method overloading, the signature of a method does not include the return value. Однако в контексте делегатов сигнатура метода содержит возвращаемое значение.But in the context of delegates, the signature does include the return value. Другими словами, метод должен иметь тот же возвращаемый тип, что и делегат.In other words, a method must have the same return type as the delegate.

Благодаря возможности ссылаться на метод как на параметр делегаты идеально подходят для определения методов обратного вызова.This ability to refer to a method as a parameter makes delegates ideal for defining callback methods. Например, ссылка на метод, сравнивающий два объекта, может быть передана в качестве аргумента алгоритму сортировки.For example, a reference to a method that compares two objects could be passed as an argument to a sort algorithm. Поскольку код сравнения находится в отдельной процедуре, алгоритм сортировки может быть написан более общим способом.Because the comparison code is in a separate procedure, the sort algorithm can be written in a more general way.

Общие сведения о делегатахDelegates Overview

Делегаты имеют следующие свойства.Delegates have the following properties:

  • Делегаты подобны указателям на функции в C++, но являются полностью объектно-ориентированными и, в отличие от указателей C++ на функции-члены, инкапсулируют экземпляр объекта вместе с методом.Delegates are similar to C++ function pointers, but delegates are fully object-oriented, and unlike C++ pointers to member functions, delegates encapsulate both an object instance and a method.

  • Делегаты допускают передачу методов в качестве параметров.Delegates allow methods to be passed as parameters.

  • Делегаты можно использовать для определения методов обратного вызова.Delegates can be used to define callback methods.

  • Делегаты можно связывать друг с другом; например, при появлении одного события можно вызывать несколько методов.Delegates can be chained together; for example, multiple methods can be called on a single event.

  • Точное соответствие методов типу делегата не требуется.Methods do not have to match the delegate type exactly. Дополнительные сведения см. в разделе Использование вариативности в делегатах.For more information, see Using Variance in Delegates.

  • В C# версии 2.0 введена концепция анонимных методов, которые позволяют передавать блоки кода в виде параметров вместо использования отдельно определенного метода.C# version 2.0 introduced the concept of Anonymous Methods, which allow code blocks to be passed as parameters in place of a separately defined method. В C# 3.0 для краткой записи встроенных блоков кода введены лямбда-выражения.C# 3.0 introduced lambda expressions as a more concise way of writing inline code blocks. В результате компиляции как анонимных методов, так и лямбда-выражений (в определенном контексте) получаются типы делегатов.Both anonymous methods and lambda expressions (in certain contexts) are compiled to delegate types. В настоящее время эти возможности называются анонимными возможностями.Together, these features are now known as anonymous functions. Дополнительные сведения о лямбда-выражениях см. в разделе Анонимные функции.For more information about lambda expressions, see Anonymous Functions.

В этом разделеIn This Section

Спецификация языка C#C# Language Specification

Дополнительные сведения см. в разделе Делегаты в Спецификации языка C#.For more information, see Delegates in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

Делегаты, события и лямбда-выражения в справочном руководстве по C# 3.0, третье издание: более 250 решений для программистов на C# 3.0Delegates, Events, and Lambda Expressions in C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers

Делегаты и события в статье Изучение C# 3.0: овладение основными понятиями C# 3.0Delegates and Events in Learning C# 3.0: Master the fundamentals of C# 3.0

См. такжеSee Also