Comparison Between Properties and Indexers 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Comparison Between Properties and Indexers



Indexers are like properties. Except for the differences shown in the following table, all the rules that are defined for property accessors apply to indexer accessors also.

Property Indexer
Allows methods to be called as if they were public data members. Allows elements of an internal collection of an object to be accessed by using array notation on the object itself.
Accessed through a simple name. Accessed through an index.
Can be a static or an instance member. Must be an instance member.
A get accessor of a property has no parameters. A get accessor of an indexer has the same formal parameter list as the indexer.
A set accessor of a property contains the implicit value parameter. A set accessor of an indexer has the same formal parameter list as the indexer, and also to the value parameter.
Supports shortened syntax with Auto-Implemented Properties. Does not support shortened syntax.

 


Сравнение свойств и индексаторов

Индексаторы подобны свойствам. За исключением различий, перечисленных в следующей таблице, все правила, определенные для методов доступа к свойствам, применимы и к методам доступа к индексаторам.

Свойство Индексатор
Позволяет вызывать методы как открытые элементы данных. Обеспечивает доступ к элементам внутренней коллекции объекта с помощью представления массива самого объекта.
Доступ посредством простого имени. Доступ посредством индекса.
Допускаются статические члены или члены экземпляров. Допускаются только члены экземпляров.
Метод доступа get свойства не имеет параметров. Метод доступа get индексатора имеет такой же список формальных параметров, как и индексатор.
Метод доступа set свойства содержит неявный параметр value. Метод доступа set индексатора имеет такой же список формальных параметров, как и индексатор, а также параметр value.
Поддерживается сокращенный синтаксис с Автоматически реализуемые свойства. Сокращенный

 


Delegates

A delegate is a type that references a method. Once a delegate is assigned a method, it behaves exactly like that method. The delegate method can be invoked like any other method, with parameters and a return value, as in this example:

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

Any method from any accessible class or struct that matches the delegate's signature, which consists of the return type and parameters, 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. As long as you know the signature of the delegate, you can assign your own delegated method.

Note:
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.

This ability to refer to a method as a parameter makes delegates ideal for defining callback methods. For example, a sort algorithm could be passed a reference to the method that compares two objects. Separating the comparison code allows for the algorithm to be written in a more general way.

Delegates Overview

Delegates have the following properties:

· Delegates are like C++ function pointers but are type safe.

· 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 signature exactly.

· 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 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.


Делегаты

Делегат — это тип, который ссылается на метод. Когда делегату назначается методу, он ведет себя в точности, как этот метод. Метод делегата можно вызывать с параметрами и возвращаемым значением как и любой другой метод, как показано в примере:

ß----

Делегату можно назначить любой метод из любого доступного класса или структуры, соответствующий подписи делегата, которая состоит из типа возвращаемого значения и параметров. Этот метод должен быть статическим методом или методом экземпляра. Это позволяет программно изменять вызовы метода, а также включать новый код в существующие классы. Если подпись делегата известна, можно назначить собственный делегируемый метод.

Примечание.
В контексте перегрузки метода подпись метода не содержит возвращаемое значение. Однако в контексте делегатов подпись метода содержит возвращаемое значение.

Благодаря возможности ссылаться на метод как на параметр делегаты оптимально подходят для задания функций обратного вызова. Например, алгоритм сортировки можно передать как ссылку на метод, сравнивающий два объекта. Отделение кода сравнения позволяет составить алгоритм в более общем виде.

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

Делегаты имеют следующие свойства.

· Делегаты похожи на указатели функций в C++, но являются строго типизированными.

· Делегаты допускают передачу методов в качестве параметров.

· Делегаты можно использовать для задания функций обратного вызова.

· Делегаты можно связывать друг с другом; например, несколько методов можно вызвать по одному событию.

· Точное соответствие методов подписи делегата не требуется. Дополнительные сведения см. в разделе Ковариация и контрвариация в делегатах.

· В C# версии 2.0 представлена концепция анонимных методов, которые позволяют передавать блоки кода в виде параметров вместо использования отдельно определенного метода. В C# 3.0 для краткой записи встроенных блоков кода введены лямбда-выражения. В результате компиляции как анонимных методов, так и лямбда-выражений (в определенном контексте) получаются типы делегатов. В настоящее время эти функции объединяются под одним названием — анонимные функции. Дополнительные сведения о лямбда-выражениях см. в разделе Анонимные функции.


Using Delegates

A delegate is a type that safely encapsulates a method, similar to a function pointer in C and C++. Unlike C function pointers, delegates are object-oriented, type safe, and secure. The type of a delegate is defined by the name of the delegate. The following example declares a delegate named Del that can encapsulate a method that takes a string as an argument and returns void:

public delegate void Del(string message);

A delegate object is normally constructed by providing the name of the method the delegate will wrap, or with an anonymous Method. Once a delegate is instantiated, a method call made to the delegate will be passed by the delegate to that method. The parameters passed to the delegate by the caller are passed to the method, and the return value, if any, from the method is returned to the caller by the delegate. This is known as invoking the delegate. An instantiated delegate can be invoked as if it were the wrapped method itself. For example:

// Create a method for a delegate. public static void DelegateMethod(string message) { System.Console.WriteLine(message); }
// Instantiate the delegate. Del handler = DelegateMethod;   // Call the delegate. handler("Hello World");

Delegate types are derived from the Delegate class in the.NET Framework. Delegate types are sealed—they cannot be derived from— and it is not possible to derive custom classes from Delegate. Because the instantiated delegate is an object, it can be passed as a parameter, or assigned to a property. This allows a method to accept a delegate as a parameter, and call the delegate at some later time. This is known as an asynchronous callback, and is a common method of notifying a caller when a long process has completed. When a delegate is used in this fashion, the code using the delegate does not need any knowledge of the implementation of the method being used. The functionality is similar to the encapsulation interfaces provide.

 


Использование делегатов

Делегат — эти тип, который безопасно инкапсулирует метод, т. е. его действие схоже с указателем функции в C и C++. В отличие от указателей функций в C делегаты объектно-ориентированы, строго типизированы и безопасны. Тип делегата задается его именем. В следующем примере объявляется делегат с именем Del, который может инкапсулировать метод, использующий в качестве аргумента значение string и возвращающий значение void:

public delegate void Del(string message);

Объект делегата обычно создается указанием имени метода, для которого делегат будет служить оболочкой, или с помощью анонимного метода. После создания экземпляра делегата вызов метода, выполненный в делегате, передается делегатом в этот метод. Параметры, передаваемые делегату вызывающим объектом, передаются в метод, а возвращаемое методом значение (при его наличии) возвращается делегатом в вызывающий объект. Эта процедура называется вызовом делегата. Делегат, для которого создан экземпляр, можно вызвать, как если бы это был метод, для которого создается оболочка. Пример.

ß---

Типы делегатов являются производными от класса Delegate в платформе.NET Framework. Типы делегатов являются запечатанными — от них нельзя наследовать, а от Delegate нельзя создавать производные пользовательские классы. Поскольку созданный экземпляр делегата является объектом, его можно передавать как параметр или назначать свойству. Это позволяет методу принимать делегат в качестве параметра и вызывать делегат впоследствии. Эта процедура называется асинхронным обратным вызовом и обычно используется для уведомления вызывающего объекта о завершении длительной операции. Когда делегат используется таким образом, коду, использующему делегат, не требуются сведения о реализации используемого метода. Данные функциональные возможности похожи на возможности, предоставляемые интерфейсами инкапсуляции. Дополнительные сведения см. в разделе Использование делегатов вместо интерфейсов.

 


Another common use of callbacks is defining a custom comparison method and passing that delegate to a sort method. It allows the caller's code to become part of the sort algorithm. The following example method uses the Del type as a parameter:

public void MethodWithCallback(int param1, int param2, Del callback) { callback("The number is: " + (param1 + param2).ToString()); }

You can then pass the delegate created above to that method:

MethodWithCallback(1, 2, handler);

and receive the following output to the console:

The number is: 3

Using the delegate as an abstraction, MethodWithCallback does not need to call the console directly—it does not have to be designed with a console in mind. What MethodWithCallback does is simply prepare a string and pass the string to another method. This is especially powerful since a delegated method can use any number of parameters.

When a delegate is constructed to wrap an instance method, the delegate references both the instance and the method. A delegate has no knowledge of the instance type aside from the method it wraps, so a delegate can refer to any type of object as long as there is a method on that object that matches the delegate signature. When a delegate is constructed to wrap a static method, it only references the method. Consider the following declarations:

public class MethodClass { public void Method1(string message) { } public void Method2(string message) { } }

Along with the static DelegateMethod shown previously, we now have three methods that can be wrapped by a Del instance.

 


Обратный вызов также часто используется для задания специального метода сравнения и передачи этого делегата в метод сортировки. Это позволяет сделать код вызывающего объекта частью алгоритма сортировки. В следующем примере метод использует тип Del как параметр:

ß----

Затем можно передать созданный ранее делегат в данный метод:

MethodWithCallback(1, 2, handler);

и получить следующие выходные данные в окне консоли:

The number is: 3

При использовании делегата в качестве абстракции методу MethodWithCallback не нужно выполнять непосредственный вызов консоли, то есть его можно создавать без учета консоли. Метод MethodWithCallback просто подготавливает строку и передает ее в другой метод. Это очень удобно, так как делегируемый метод может использовать любое количество параметров.

Если делегат создан для обеспечения оболочки для метода экземпляра, то этот делегат ссылается и на экземпляр, и на метод. Делегат не имеет сведений о типе экземпляра, кроме полученных из метода, для которого он обеспечивает оболочку, поэтому делегат может ссылаться на любой тип объекта, если для этого объекта есть метод, соответствующий подписи делегата. Если делегат создан для обеспечения оболочки для статического метода, то этот делегат ссылается только на метод. Рассмотрим следующие объявления:

ß----

Вместе с рассмотренным ранее статическим методом DelegateMethod у нас есть три метода, для которых можно создать оболочку с помощью экземпляра Del.

 


A delegate can call more than one method when invoked. This is referred to as multicasting. To add an extra method to the delegate's list of methods—the invocation list—simply requires adding two delegates using the addition or addition assignment operators ('+' or '+='). For example:

MethodClass obj = new MethodClass(); Del d1 = obj.Method1; Del d2 = obj.Method2; Del d3 = DelegateMethod;   //Both types of assignment are valid. Del allMethodsDelegate = d1 + d2; allMethodsDelegate += d3;

At this point allMethodsDelegate contains three methods in its invocation list—Method1, Method2, and DelegateMethod. The original three delegates, d1, d2, and d3, remain unchanged. When allMethodsDelegate is invoked, all three methods are called in order. If the delegate uses reference parameters, the reference is passed sequentially to each of the three methods in turn, and any changes by one method are visible to the next method. When any of the methods throws an exception that is not caught within the method, that exception is passed to the caller of the delegate and no subsequent methods in the invocation list are called. If the delegate has a return value and/or out parameters, it returns the return value and parameters of the last method invoked. To remove a method from the invocation list, use the decrement or decrement assignment operator ('-' or '-='). For example:

//remove Method1 allMethodsDelegate -= d1;   // copy AllMethodsDelegate while removing d2 Del oneMethodDelegate = allMethodsDelegate - d2;

Because delegate types are derived from System.Delegate, the methods and properties defined by that class can be called on the delegate. For example, to find the number of methods in a delegate's invocation list, you may write:

int invocationCount = d1.GetInvocationList().GetLength(0);

 


При вызове делегат может вызывать сразу несколько методов. Это называется многоадресностью. Чтобы добавить в список методов делегата (список вызова) дополнительный метод, необходимо просто добавить два делегата с помощью оператора сложения или назначения сложения ("+" или "+="). Пример.

ß----

На данном этапе список вызова делегата allMethodsDelegate содержит три метода — Method1, Method2 и DelegateMethod. Три исходных делегата d1, d2 и d3 остаются без изменений. При вызове allMethodsDelegate все три метода вызываются по порядку. Если делегат использует параметр, передаваемый по ссылке, эта ссылка передается после каждого из трех методов, а все изменения одного из методов становятся видны в следующем методе. Если любой из методов вызывает неперехваченное исключение, то это исключение передается в вызывающий делегат объект, а последующие методы в списке вызова не вызываются. Если делегат имеет возвращаемое значение и/или выходные параметры, он возвращает возвращаемое значение и параметры последнего вызванного метода. Для удаления метода из списка вызова используйте оператор декремента или назначения декремента ("-" или "-="). Пример.

//remove Method1 allMethodsDelegate -= d1;   // copy AllMethodsDelegate while removing d2 Del oneMethodDelegate = allMethodsDelegate - d2;

Поскольку типы делегата являются производными от System.Delegate, в делегате можно вызывать методы и свойства, задаваемые данным классом. Например, чтобы определить число методов в списке вызова делегата, можно использовать код:

int invocationCount = d1.GetInvocationList().GetLength(0);

 


Delegates with more than one method in their invocation list derive from MulticastDelegate, which is a subclass of System.Delegate. The above code works in either case because both classes support GetInvocationList.

Multicast delegates are used extensively in event handling. Event source objects send event notifications to recipient objects that have registered to receive that event. To register for an event, the recipient creates a method designed to handle the event, then creates a delegate for that method and passes the delegate to the event source. The source calls the delegate when the event occurs. The delegate then calls the event handling method on the recipient, delivering the event data. The delegate type for a given event is defined by the event source.

Comparing delegates of two different types assigned at compile-time will result in a compilation error. If the delegate instances are statically of the type System.Delegate, then the comparison is allowed, but will return false at run time. For example:

delegate void Delegate1(); delegate void Delegate2();   static void method(Delegate1 d, Delegate2 e, System.Delegate f) { // Compile-time error. //Console.WriteLine(d == e);   // OK at compile-time. False if the run-time type of f //is not the same as that of d. System.Console.WriteLine(d == f); }

Делегаты, в списке вызова которых находятся несколько методов, является производным от MulticastDelegate, являющегося подклассом System.Delegate. Приведенный выше код работает в любом из случаев, так как оба класса поддерживают GetInvocationList.

Групповые делегаты часто используются при обработке событий. Объекты источников событий отправляют уведомления объектам получателей, зарегистрированным для получения данного события. Чтобы зарегистрироваться для получения события, объект получателя создает метод, предназначенный для обработки этого события, затем создает делегат для этого метода и передает его в источник события. Когда происходит событие, источник вызывает делегат. После этого делегат вызывает в объекте получателя метод обработки события, предоставив ему данные события. Тип делегата для данного события задается источником события. Дополнительные сведения см. в разделе События.

Назначение сравнения делегатов двух различных типов во время компиляции вызовет ошибку компиляции. Если экземпляры делегата статически относятся к типу System.Delegate, то сравнение допустимо, но возвратит значение false во время выполнения. Пример.

ß-------



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 121; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.70.157 (0.041 с.)