Использование делегатов
Делегат — эти тип, который безопасно инкапсулирует метод, т. е. его действие схоже с указателем функции в 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 во время выполнения. Пример.
-------
Delegates with Named vs. Anonymous Methods
A delegate can be associated with a named method. When you instantiate a delegate by using a named method, the method is passed as a parameter, for example:
// Declare a delegate: delegate void Del(int x);
// Define a named method: void DoWork(int k) { /* ... */ }
// Instantiate the delegate using the method as a parameter: Del d = obj.DoWork; |
This is called using a named method. Delegates constructed with a named method can encapsulate either a static method or an instanced method. Named methods are the only way to instantiate a delegate in earlier versions of C#. However, in a situation where creating a new method is unwanted overhead, C# enables you to instantiate a delegate and immediately specify a code block that the delegate will process when it is called. These are called Anonymous Methods.
Remarks
The method that you pass as a delegate parameter must have the same signature as the delegate declaration.
A delegate instance may encapsulate either static or instance method.
Although the delegate can use an out parameter, we do not recommend its use with multicast event delegates because you cannot know which delegate will be called.
- Оглавление
- Метод Main
- Ввод и вывод
- Компиляция и выполнение
- Общая структура программы на c#
- Main() и аргументы командной строки
- Общие сведения
- Аргументы командной строки
- Отображение аргументов командной строки
- Доступ к аргументам командной строки с помощью оператора "foreach"
- Значения, возвращаемые методом Main()
- Пример результатов выполнения
- Общие сведения о типах данных
- Приведение
- Результат
- Упаковка-преобразование и распаковка-преобразование3
- Производительность
- Упаковка-преобразование4
- Описание5
- Результат
- Распаковка-преобразование6
- Описание7
- Результат
- Преобразование массива байтов в значение типа "int"8
- Пример9
- Преобразование строки в значение типа "int"
- Преобразование шестнадцатеричных строк10
- Массивы
- Общие сведения о массивах
- Массивы как объекты
- Результат
- Одномерные массив
- Массивы типов значений и ссылочных типов.
- Многомерные массивы
- Инициализация массива
- Массивы массивов
- Результат
- Использование оператора foreach с массивами
- Передача массивов в качестве параметров
- Передача одномерных массивов в качестве параметров
- Пример 1 Описание
- Результат 1
- Передача многомерных массивов в качестве параметров
- Пример 2 Описание
- Передача массивов при помощи параметров ref и out
- Пример 1
- Пример 2
- Неявно типизированные массивы11
- Неявно типизированные массивы в инициализаторах объектов12
- Использование строк
- Работа со строками Escape-знаки
- Точные строки: символ @
- Доступ к отдельным знакам
- Смена регистра
- Сравнения
- Разделение строки на подстроки
- Строки с нулевыми значениями и пустые строки
- Использование класса StringBuilder13
- Анализ строк с помощью метода разделения
- Навигация по содержимому строки с помощью строковых методов
- Анализ строк с помощью регулярных выражений14
- Объединение нескольких строк
- Изменение содержимого строки
- Определение наличия числового значения в строке
- Надежное программирование
- Безопасность
- Базовые типы кодировки
- Типы форматирования
- Общие сведения о форматировании
- Описатели формата
- Анализ и описатели формата
- Метод ToString и описатели формата
- Поставщики формата15
- Составное форматирование
- Форматирование базовых типов
- Форматирование для различных языков и региональных параметров16
- Составное форматирование
- Строка составного формата
- Синтаксис элементов форматирования
- Выравнивание
- Компонент строки формата
- Оформление фигурных скобок17
- Порядок обработки18
- Примеры кода
- Строки числовых форматов
- Строки стандартных числовых форматов
- Примечания Настройки панели управления
- Свойства NumberFormatInfo
- Целочисленные типы и типы с плавающей запятой
- Бесконечности действительных чисел с плавающей запятой и NaN
- Строки настраиваемых числовых форматов19
- Примечания Бесконечности действительных чисел с плавающей запятой и NaN
- Настройки панели управления
- Строки формата с фиксированной запятой и округлением
- Разделители секций и условное форматирование20
- Два примера настраиваемых форматов
- Регулярные выражения в .Net Framework
- Регулярные выражения как язык
- Escape-знаки
- Выполнение действия со строками с помощью основных строковых операций
- Разбор строк
- Разбор числовых строк
- Операторы и выражения
- Операторы
- Выражения
- Литералы и простые имена
- Выражения вызова
- Операторы
- Анонимные функции
- Эволюция делегатов в c#
- Лямбда-выражения22
- Выражения-лямбды
- Лямбды операторов
- Лямбды со стандартными операторами запросов
- Вывод типа в лямбда-выражениях
- Область действия переменной в лямбда-выражениях
- Использование лямбда-выражений вне linq
- Анонимные методы
- Заметки
- Перегружаемые операторы
- Операторы преобразования23
- Общие сведения об операторах преобразования
- Использование операторов преобразования
- Пример 1 Описание
- Результат 1
- Пример 2 Описание
- Результат 2
- Реализация определенных пользователем преобразований между структурами
- Надежное программирование
- Перегрузка операторов для реализации класса комплексных чисел
- Переопределение Equals
- Объекты, классы и структуры
- Интерфейсы
- Универсальные типы
- Статические типы
- Объекты
- Экземпляры структуры и экземпляры класса
- Идентификация объекта и идентификация значения26
- Объявление классов
- Создание объектов
- Наследование классов
- Описание
- Результат
- Общие сведения о классах
- Структуры
- Общие сведения о структурах
- Использование структур
- Пример 1 Описание
- Результат
- Пример 2 Описание
- Результат
- Наследование
- Абстрактные и запечатанные классы и члены классов
- Абстрактные классы и члены классов
- Запечатанные классы и члены классов
- Определение абстрактных свойств
- Полиморфизм
- Общие сведения о полиморфизме
- Управление версиями с помощью ключевых слов "Override" и "New"
- Переопределение и выбор метода29
- Использование ключевых слов "Override" и "New"
- Переопределение метода ToString
- Порядок переопределения метода OnString в классе или структуре
- Интерфейсы
- Общие сведения об интерфейсах
- Явная реализация интерфейса33
- Явная реализация членов интерфейса
- Надежное программирование
- Явная реализация членов интерфейса с наследованием
- Надежное программирование
- Параметры методов
- Возвращаемые значения
- Передача параметров
- Передача параметров типа значения
- Пример. Передача типов значений с помощью значения.
- Пример. Передача типов значений с помощью ссылки.
- Пример. Замена типов значений.
- Передача параметров ссылочного типа
- Пример. Передача ссылочных типов по значению
- Результат
- Рассмотрение кода
- Пример. Передача ссылочных типов по ссылке
- Результат
- Рассмотрение кода
- Пример. Перестановка двух строк
- Результат
- Рассмотрение кода
- Конструкторы
- Использование конструкторов
- Конструкторы экземпляров
- Пример 1
- Результат
- Пример 2
- Результат
- Пример 3
- Результат
- Закрытые конструкторы35
- Результат
- Статические конструкторы36
- Результат
- Создание конструктора копии
- Деструкторы
- Заметки
- Использование деструкторов для освобождения ресурсов.
- Высвобождение ресурсов явным образом
- Результат
- Инициализаторы объектов и коллекций
- Инициализаторы объектов и анонимные типы37
- Инициализаторы объектов и типы, допускающие значение null
- Инициализаторы коллекций
- Инициализация объектов без вызова конструктора
- Компиляция кода38
- Инициализация словаря с помощью инициализатора коллекции39
- Компиляция кода
- Константы
- Вложенные типы
- Модификаторы доступа
- Доступность класса и структуры
- Доступность члена класса и структуры
- Другие типы
- Разделяемые классы и методы40
- Разделяемый класс
- Ограничения
- Пример 1 Описание
- Результат
- Пример 2 Описание
- Разделяемые методы
- Статические классы и члены статических классов
- Статические классы
- Когда следует использовать статические классы
- Статические члены
- Входные данные
- Пример результатов выполнения.
- Определение различия между передачей структуры и ссылки класса в метод
- Анонимные типы41
- Заметки
- Возвращение поднаборов свойств элементов в запросе
- Компиляция кода
- Методы расширения
- Неявно типизированные локальные переменные
- Var и анонимные типы
- Заметки
- Свойства
- Результат
- Общие сведения о свойствах
- Использование свойств
- Метод доступа get
- Метод доступа set
- Заметки
- Пример 1 Описание
- Результат 1 Employee number: 101 Employee name: Claude Vige
- Пример 2 Описание
- Результат 2
- Рассмотрение кода
- Пример 3 Описание
- Введенные данные
- Результат 3
- Свойства интерфейса
- Пример результатов выполнения
- Асимметричные методы доступа
- Ограничения модификаторов доступа в методах доступа
- Модификаторы доступа в переопределяющих методах доступа
- Реализация интерфейсов
- Домен доступности к методу доступа
- Результат
- Примечания
- Объявление и использование свойств чтения и записи
- Надежное программирование
- Автоматически реализуемые свойства
- Реализация облегченного класса с автоматически реализуемыми свойствами
- Индексаторы
- Общие сведения об индексаторах
- Использование индексаторов
- Заметки
- Пример 1 Описание
- Индексирование с использованием других значений
- Пример 2 Описание
- Результат
- Надежное программирование
- Индексаторы в интерфейсах
- Результат
- Сравнение свойств и индексаторов
- Делегаты
- Общие сведения о делегатах
- Использование делегатов
- Делегаты с именованными методами и делегаты с анонимными методами
- Заметки
- Пример 1
- Результат
- Пример 2
- Результат
- Использование делегатов вместо интерфейсов
- Ковариация и контрвариация в делегатах
- Пример 1 (ковариация) Описание
- Пример 2 (контрвариация) Описание
- Объединение делегатов (многоадресные делегаты)
- Объявление, создание экземпляра и использование делегата
- Надежное программирование
- События
- Общие сведения о событиях
- Подписка и отмена подписки на события
- Подписка на события в среде ide Visual Studio
- Подписка на события программными средствами
- Подписка на события при помощи анонимного метода
- Отмена подписки
- Отмена подписки на событие
- Публикация событий, соответствующих рекомендациям .Net Framework
- Порядок публикации событий, основанных на шаблоне EventHandler
- Создание событий базового класса в производных классах
- Вызов и прием событий
- Реализация событий интерфейса
- Реализация событий интерфейса в классе
- Пример44
- Использование словаря для хранения экземпляров событий
- Универсальные шаблоны
- Общие сведения об универсальных шаблонах
- Введение в универсальные шаблоны
- Преимущества универсальных шаблонов
- Параметры универсального типа
- Рекомендации по именованию параметра типа
- Пространства имен
- Общие сведения о пространствах имен
- Использование пространств имен
- Доступ к пространствам имен
- Псевдонимы пространств имен
- Использование пространств имен для управления областью действия
- Полные имена
- Использование квалификатора псевдонима пространства имен
- Типы, допускающие значения null
- Общие сведения о типах, допускающих значения null
- Использование типов, допускающих значение null
- Примеры допускающих значение null типов
- Члены допускающих значение null типов
- Явные преобразования
- Неявные преобразования
- Операторы
- Оператор ??
- Идентификация типа, допускающего значение null
- Небезопасный код и указатели
- Общие сведения о небезопасном коде
- Буферы фиксированного размера
- Заметки
- Типы указателей45
- Преобразования указателей
- Неявные преобразования указателей
- Явные преобразования указателей
- Результат
- Выражения указателей Получение значения переменной указателя
- Получение адреса переменной
- Доступ к члену с использованием указателя
- Доступ к элементу массива с использованием указателя
- Управление указателями Увеличение и уменьшение указателей
- Арифметические операции над указателями
- Сравнение указателей
- Использование указателей для копирования массива байтов
- Комментарии xml-документации
- Рекомендуемые теги для комментариев документации
- Использование xml-документации
- Компиляция кода
- Надежное программирование
- Домены приложений
- Общие сведения о доменах приложений
- Выполнение кода в другом домене приложения
- Сборки и глобальный кэш сборок
- Общие сведения о сборках
- Атрибуты
- Общие сведения об атрибутах
- Использование атрибутов
- Общие атрибуты
- Заметки
- Использование нескольких идентификаторов
- Атрибут Obsolete
- Глобальные атрибуты
- Исключения и обработка исключений
- Общие сведения об исключениях
- Использование исключений
- Обработка исключений
- Блоки catch
- Блоки finally
- Создание и генерация исключений
- Чего следует избегать при генерации исключений
- Определение классов исключений
- Исключения, создаваемые компилятором
- Обработка исключений с помощью блока try-catch
- Примечания
- Выполнение кода очистки с использованием блока finally
- Взаимодействие
- Использование вызова неуправляемого кода для воспроизведения звукового файла
- Компиляция кода Чтобы скомпилировать этот код, выполните следующие действия47
- Создание потоков
- Общие сведения
- Использование потоков
- Синхронизация потоков
- Ключевое слово lock
- Мониторы
- События синхронизации и дескрипторы ожидания
- Мьютексные объекты
- Создание и завершение потоков
- Синхронизация потока-производителя и потока-потребителя
- Использование пула потоков
- Отражение
- Общие сведения об отражении
- Библиотеки c#
- Создание и использование библиотек dll на языке c#
- Выполнение
- Результат
- Компиляция кода
- Безопасность
- Рекомендации по безопасности, касающиеся языка c# в отдельности
- Использование неуправляемых функций dll
- Применение экспортированных функций dll
- Подробный обзор вызова неуправляемого кода
- Идентификация функций в библиотеках dll
- Создание класса, содержащего функции dll
- Создание прототипов в управляемом коде
- Основы описания
- Настройка описания
- Задание точки входа
- Вызов функции dll
- Передача структур
- Объявление и передача структур
- Объявление и передача классов
- Файловый и потоковый ввод-вывод
- Основы файлового ввода-вывода
- Классы, используемые в файловом вводе и выводе
- Классы, используемые для чтения и записи в поток
- Общие классы потокового ввода и вывода
- Ввод-вывод и безопасность
- Создание списка каталогов
- Надежное программирование
- Считывание из нового файла данных и запись в этот файл
- Надежное программирование
- Копирование каталогов
- Открытие файла журнала и добавление в него данных
- Запись текста в файл
- Считывание текста из файла
- Надежное программирование
- Считывание символов из строки
- Результат
- Запись символов в строку
- Надежное программирование
- Добавление или удаление записей списка управления доступом
- Чтобы добавить или удалить элемент списка управления доступом из файла
- Чтобы добавить или удалить элемент acl из каталога
- Компиляция кода
- Сжатие файлов
- Создание потоков
- Создание класса Writer
- Коллекции и структуры данных
- Определение коллекций
- Выбор класса коллекции
- Знакомство с решениями, проектами и элементами
- Контейнеры: проекты и решения
- Элементы: файлы, ссылки, подключения к данным
- Решения как контейнеры
- Решения
- Преимущества
- Файлы определения
- Проекты как контейнеры
- Шаблоны проектов
- Файлы проекта
- Элементы проектов
- Использование интегрированной среды разработки Visual c#
- Введение в интегрированную среду разработки
- Средства Visual c#
- Доступ к средствам в интегрированной среде разработки
- Окна редактора и конструктора форм Windows
- Обозреватель решений и конструктор проектов
- Окна компилятора, отладчика и списка ошибок
- Настройка интегрированной среды разработки
- Создание проекта
- Создание нового проекта
- Состав проекта Свойства
- Ресурсы
- Другие файлы исходного кода
- Изменение свойств проекта
- Создание пользовательского интерфейса
- Добавление элементов управления
- Задание свойств
- Обработка событий
- Редактирование кода
- Списки завершения
- Краткие сведения
- Список членов
- Сведения о параметрах
- Добавление директив using
- Оптимизация кода
- Фрагменты кода
- Подчеркивание волнистой линией
- Средства обеспечения удобочитаемости кода Форматирование кода
- Структура
- Выделение цветом
- Навигация и поиск
- Представление классов
- Навигация ctrl-tab
- Панели переходов
- Поиск в файлах
- Обозреватель объектов
- Стеки навигации
- Построение и отладка
- Параметры построения
- Ошибки построения
- Сравнение отладочной и выпускной конфигураций
- Отладка
- Моделирование и анализ кода
- Конструктор классов
- Обозреватель объектов
- Метаданные как источник
- Анализ управляемого кода
- Добавление и редактирование ресурсов
- Добавление ресурсов в проекты
- Редактирование ресурсов
- Компиляция ресурсов в сборки
- Доступ к ресурсам во время выполнения
- Получение справки
- Локальная справка и справка в Интернете
- Поиск по f1
- Указатель
- Содержание
- Инструкции
- Динамическая справка
- Примеры
- Оптимизация
- Многопроектная оптимизация
- Диалоговое окно "Предварительный просмотр изменений"
- Допускающая наличие ошибок оптимизация
- Извлечение метода
- Оптимизация кода с помощью операции "извлечение метода"
- Чтобы воспользоваться операцией "извлечение метода"
- Переименовать
- Операции переименования
- Переименование идентификаторов
- Чтобы переименовать идентификатор
- Превращение локальной переменной в параметр
- Заметки
- Превращение локальной переменной в параметр
- Чтобы выполнить превращение локальной переменной в параметр
- Разметка кода цветом
- Лексемы
- Контекстные ключевые слова
- Разметка цветом для обозначения парности фигурных скобок
- Разметка цветом и жирным шрифтом
- Разметка цветом и выделение цветным фоном