
- •Лабораторная работа №1
- •Теоретические сведения. Среда .Net RunTime и библиотека Framework
- •Процесс компиляции с# - программы:
- •Управляемый и неуправляемый код.
- •Создание проекта.
- •Анатомия программы.
- •Контрольные вопросы.
- •Лабораторная работа №2
- •Теоретические сведения. Операторы условия.
- •Оператор множественного выбора:
- •Форматирование вывода
- •Задание.
- •Контрольные вопросы.
- •Лабораторная работа №3
- •Теоретические сведения.
- •Объявление массивов
- •Значения по умолчанию
- •Обращение к элементам массива
- •Инициализация элементов массива
- •Цикл foreach
- •Инициализация одномерных массивов
- •Практический пример. Одномерный массив.
- •Задание.
- •Контрольные вопросы.
- •Лабораторная работа №4
- •Теоретические положения. Уровни доступа
- •Объявление статических полей и методов класса
- •Пометка и сжатие
- •Форсированная сборка мусора
- •Методы. Передача параметров по значению
- •Методы. Передача параметров по ссылке.
- •Практический пример. Класс Array (одномерный массив).
- •Задание.
- •Контрольные вопросы.
- •Лабораторная работа №5
- •Задание.
- •Список рекомендуемой литературы
Пометка и сжатие
Работа сборщика мусора основана на алгоритме "пометки и сжатия". Сборщик мусора начинает свою работу с просмотра корневых объектов (включая глобальные, статические, локальные объекты и регистры процессора) и нахождения всех объектов, ссылки на которые присутствуют в корневых объектах. Объекты, используемые на момент сборки мусора, помечаются, а все остальные объекты в системе считаются ненужными.
Процесс сборки мусора завершается копированием всех используемых объектов в начало управляемой кучи и соответствующей модификацией указателей на объекты. Затем указатель устанавливается на следующий доступный блок после последнего используемого объекта. Поскольку сборщик мусора перемещает объекты и изменяет ссылки на них, в это время в системе не может выполняться никаких других операций. То есть во время работы сборщика вся полезная работа прекращается.
Форсированная сборка мусора
Функция System.GC.Collect() инициирует немедленную сборку мусора. Например, если программа только что закончила какие-то масштабные вычисления и освободила большое количество объектов, в этот момент разумно провести сборку мусора.
Методы. Передача параметров по значению
В C# есть два способа передачи параметров методу по значению, и по ссылке. В первом случае внутрь метода попадает не оригинальная переменная. а её копия, которая разрушается при выходе из метода не оказывая влияния на оригинальную переменную. При передаче методу значений обычных типов, таких как int,double и т.д. используется передача по значению. Следовательно, при изменение параметра, никакого влияния на оригинальную переменную не происходит.
Методы. Передача параметров по ссылке.
Для того чтобы решить эту проблему необходимо использовать ключевые слова ref и out, позволяющие осуществить передачу обычного типа по ссылке. В C# указание модификатора ref приводит к созданию вызова по ссылке вместо вызова по значению. Данный модификатор указывается при объявлении метода и при его вызове. Важным моментом при использовании ref является то, что значение переменной передаваемой в качестве параметра должно быть присвоено заранее до вызова метода, иначе при попытке компиляции возникнет ошибка компиляции.
Практический пример. Класс Array (одномерный массив).
Класс описывает одномерный динамический массив вещественных чисел ar длиной n. Содержит конструктор без параметров, с параметром n, копирующий конструктор, деструктор, методы инициализации, обработки и вывода массива.
Метод класса CountNegative() подсчитывает и возвращает количество отрицательных элементов в массиве. Метод класса InitArray все элементы массива инициализирует случайными числами диапазоне от -20 до 30. Метод класса EditArray() выполняет обработку массива: первые CountNegative() элементов массива удваивает, а остальным меняет знак.
using System;
namespace UnivariateArray
{
class Array
{
public Array()
{
n = 30;
ar = new int[n];
Console.WriteLine("Конструктор без параметров выполнен.");
}
public Array(int n)
{
this.n = n;
ar = new int[n];
for (int i = 0; i < n; i++)
ar[i] = 0;
Console.WriteLine("Конструктор с параметром выполнен.");
}
public Array(Array arn)
{
this.n = arn.n;
this.ar = new int[n];
for (int i = 0; i < n; i++)
ar[i] = arn.ar[i];
Console.WriteLine("Копирующий конструктор выполнен.");
}
~Array()
{
Console.WriteLine("Деструктор выполнен.");
}
public void InitArray(int a, int b)
{
Random rnd = new Random();
for (int i = 0; i < n; i++)
ar[i] = rnd.Next(a, b);
Console.WriteLine("Инициализация массива выполнена.");
}
public void PrintArray()
{
Console.WriteLine();
for (int i = 0; i < n; i++)
Console.Write("{0,8}", ar[i]);
Console.WriteLine();
}
public int CountNegative()
{
int neg = 0;
foreach (int i in ar)
{
if (i < 0)
++neg;
}
return neg;
}
public void AddingArray(ref int Sum)
{
Sum = 0;
foreach (int i in ar)
{
if (i < 0)
Sum+=i;
}
}
public void EditArray()
{
for (int i = 0; i < n; i++)
{
int neg = this.CountNegative();
if (i<neg)
ar[i]*=2;
else
ar[i]*=-1;
}
}
private int n;
private int[] ar;
}
// Конец определения класса Array
class Program
{
static void Main(string[] args)
{
Array ar0 = new Array();
Console.WriteLine("Массив с нулевыми элементами:");
ar0.PrintArray();
Console.Write("Введите длину массива: ");
int n = Convert.ToInt16(Console.ReadLine());
Array ar1 = new Array(n);
ar1.InitArray(-20, 30);
Console.WriteLine("Исходный массив ar1:");
ar1.PrintArray();
// Копирование массива ar1 в массив arN
Array arN = new Array(ar1);
// Определение суммы элементов массива arN
int Sum = 0;
arN.AddingArray(ref Sum);
Console.WriteLine("В массиве arN:");
arN.PrintArray();
Console.WriteLine("Отрицательных элементов: {0}.", arN.CountNegative());
Console.WriteLine("Сумма элементов: {0}.", Sum);
arN.EditArray();
Console.WriteLine("Массив arN после обработки:");
arN.PrintArray();
Console.ReadKey();
}
}
}
Результаты:
Конструктор без параметров выполнен.
Массив с нулевыми элементами:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Введите длину массива: 25
Конструктор с параметром выполнен.
Инициализация массива выполнена.
Копирующий конструктор выполнен.
Исходный массив ar1:
-4 2 -16 -15 -11 16 17 -16 -17 17
20 -14 27 -1 -2 14 23 -5 -4 1
23 4 7 -17 -17
В массиве arN:
-4 2 -16 -15 -11 16 17 -16 -17 17
20 -14 27 -1 -2 14 23 -5 -4 1
23 4 7 -17 -17
Отрицательных элементов: 13.
Сумма элементов: -139.
Массив arN после обработки:
-8 4 -32 -30 -22 32 34 -32 -34 34
40 -28 54 1 2 -14 -23 5 4 -1
-23 -4 -7 17 17