- •3.Понятие инкапсуляция
- •4.Понятие полиморфизм.
- •5.Платформа .NetFramework
- •6.Преимущества .NetFramework
- •8. Компоненты .Net Framework
- •9.Обзор с#
- •10.Структура программы на c#
- •11.Система типов языка с#
- •12.Использование встроенных типов данных
- •15. Операторы выбора
- •17. Обработка исключений
- •19. Перегрузка методов.
- •18. Использование методов. Использование свойств.
- •21. Особенности конструктора
- •22.Использование инкапсуляции.
- •23. Инициализация данных.
- •24.Насле́дование
- •25. Синтаксис обьявления Метода
- •26. Спецификаторы метода.
- •31.Интерфейс.
- •32. Стандартные интерфейсы .Net.
- •33. Пространство имен.System.Collections
- •34. Принципы ооп в с#. Наследование
- •35. Принципы ооп в с#. Полиморфизм
- •36. Принцыпы ооп в c#. Инкапусаляция.
- •37. Делегаты.
- •38. Пример использования делегатов. Функции высших порядков.
- •39. Случаи использования делегатов.
- •42. Интерфейс iDisposable.
- •43. Класс System.Gc
- •44. Унифицированный язык моделирования. Предметы вUml.
- •45.Унифицированный язык моделирования. Отношения в uml.
- •46. Диаграммы в uml
- •47. Унифицированный язык моделирования. Статические модели.
- •49.Моделирование поведения программной системы
- •50. Диаграммы схем состояний
- •52.Диаграммы Use Case
- •53. Технологии проектирования программного обеспечения
- •54.Парадигмы ткпо. Классический жизненный цикл.
- •55. Парадигмы ткпо. Макетирование.
- •56 Стратегии конструирования по. Однократный подход.
- •58. Спиральная модель разработки по.
- •59. Компонентно-ориентированная модель разработки по.
- •60. Унифицированный процесс разработки по.
- •Принципы
- •61. Создание многопоточных приложений. Класс Thread.
- •62. Понятие графического интерфейса пользователя.
- •63. Gui. Модель обработки событий.
- •64. Gui. Многодокументный интерфес.
- •65. Gui. Понятие диалогового окна.
- •67. Класс Form и его жизненный цикл.
- •72. Тестирование по. Основные понятия
- •73. Тестирование по. Тестирование «белого ящика»
- •74. Тестирование по. Тестирование «черного ящика»
- •75.Заповеди отладки.
38. Пример использования делегатов. Функции высших порядков.
Для того чтобы воспользоваться делегатом, необходимо создать его экземпляр и задать имена методов, на которые он будет ссылаться. При вызове экземпляра делегата вызываются все заданные в нем методы.
using System:
namespace ConsoleApplicationi
delegate void Del ( ref string s ); // объявление делегата
class Class
{
public static void C001 ( ref string s ) // метод 1
string temp = " " ;
for ( int i = 0: i < s.Length: ++i )
if ( s [ i ] == '0' || s [ i ]== ' 0 ' ) temp += '0';
else if ( s [ i ] == ' I ' ) temp += ' 1' ;
else temp += s [ i j ;
}
s = temp;
}
public static void Hack ( ref string s ) // метод 2
{
string temp = " " ;
for ( int i = 0; i < s.Length; ++i )
if ( i / 2 * 2 == i ) temp += char.ToUpper( s [ i ] );
else temp += s [ i ] ;
}
s = temp;
static void Main{
string s = "cool hackers";
Del d; // экземпляр делегата
for ( int i = 0; i < 2; ++i )
{ d = new Del( COOl ); // инициализация методом 1
if ( i == 1 ) d = new Del(Hack); // инициализация методом 2
d( ref s ); // использование делегата для вызова методов
Console.WriteLine( s );
} }
39. Случаи использования делегатов.
Делегаты применяются в основном для следующих целей:
• получения возможности определять вызываемый метод не при компиляции, а динамически во время выполнения программы;
• обеспечения связи между объектами по типу «источник — наблюдатель»;
• создания универсальных методов, в которые можно передавать другие методы;
• поддержки механизма обратных вызовов. Все эти варианты подробно обсуждаются далее. Рассмотрим сначала пример реализации первой из этих целей. В листинге 10.1 объявляется делегат, с помощью которого один и тот же оператор используется для вызова двух разных методов.
Использование делегата имеет тот же синтаксис, что и вызов метода. Если делегат хранит ссылки на несколько методов, они вызываются последовательно в том орядке, в котором были добавлены в делегат.
Добавление метода в список выполняется либо с помощью метода Combine, унаследованного от класса System.Delegate, либо, что удобнее, с помощью перегруженной операции сложения.
40-41 Управление памятью. Генерация объектов
Сборка мусора
При освобождении памяти строится дерево живых объектов. Построение начинается с корневых объектов (application roots) – это глобальные и статические объекты. Зацикливания избегают с помощью проверки на принадлежность очередного объекта графу.
Затем сборщик мусора начинает искать фрагменты, не вошедшие в дерево. Как только такие фрагменты найдены, путем копирования памяти используемые фрагменты приводятся в более компактный вид (сдвигаются вниз). После этого происходит обновление ссылок на объекты в куче. Память приводится в компактный вид только в том случае, если сборщик мусора обнаружил значительно количество недоступных объектов. С целью оптимизации большие фрагменты памяти не перемещаются.
Для оптимизации процесса сборки мусора введено понятие о трех поколениях объектов:
Все объекты создаются в поколении 0 (generation 0). Объекты, пережившие сборку мусора, переходят в следующее поколение: 1 или 2.
При запуске сборщик мусора сначала ищет недостижимые объекты в поколении 0. Если они найдены, память приводится к компактному виду, а объекты пережившие сборку мусора переходят в поколение 0. Просмотр объектов поколении 1 будет происходить только в том случае, если памяти, освобожденной от объектов поколения 0 окажется недостаточно для размещения новых объектов. Объекты из поколения 1, пережившие сборку мусора переходят в поколение 2. Просмотр объектов поколения 2 происходит, если просмотр объектов поколений 0 и 1 не освободил достаточного количества памяти