НЕКОТОРЫЕ АСПЕКТЫ РАБОТЫ С ЭЛЕМЕНТАМИ МАССИВОВ НА ЯЗЫКЕ C#
Тазетдинов Булат Ильгизович
кандидат физико-математических наук
Бирский филиал ФГБОУ ВО
«Башкирский государственный университет»
Россия, г.Бирск, e-mail: bulatbirsk@yandex.ru
Массив относится к ссылочным типам данных, то есть располагается в динамической области памяти, поэтому создание массива начинается с выделением памяти под его элементы. В качестве элементов могут выступать как значимые, так и ссылочные типы данных (в том числе массивы) [1].
Типы значения хранят свое содержимое в памяти, выделенное в стеке, при выходе переменной из области действия, в связи с завершением метода, где она была объявлена, значение удаляется из стека. Переменные же ссылочного типа хранят свои данные в другой области памяти, называемой кучей. Эта память освобождается только тогда, когда система сборки мусора C# позволяет определить, что она больше не нужна[2].
Описание массива имеет вид
int[] a = new int[20]; int[] f = new int[10];
Здесь описаны два массива, для массивов a и f выделена память под 20 и 10 элементов целого типа int соответственно. Массивы одного типа можно присвоить между собой, например: g = d;.
В результате происходит присваивание ссылок и массивы g и d ссылаются на одну и ту же ячейку памяти (кучу). В случае потребности копирования массива в C# можно поступить несколькими способами.
Поэлементное присваивание массива одного другому:
for (int i = 0; i < a.Length; i++)
{ f[i] = a[i]; Console.Write(» » + f[i]); }
Здесь переменные значения копируются в стеке. Это весьма снижает производительность в случае больших массивов, поэтому желательно использовать весьма мощные встроенные методы и свойства базового класса Array. Здесь имеются весьма удобные методы Clone() и Copy() при работе со ссылочными типами. Метод Clone() создает неглубокую копию (shallow) массива. Иными словами, он создает новый массив, причем если элементы его относятся к типу значений, то все они копируются, а если массив содержит элементы ссылочного типа, то копируются ссылки на элементы [3]:
int[] s = (int[])d.Clone();
string[] str2 = (string[])str1.Clone();
здесь элементы массива d копируются в отдельную кучу массива s, в результате у нас имеется два отдельных массива, с одинаковыми по величине элементами. А элементы массива str2 копируют ссылки на свою кучу из кучи элементов массива str1. Метод Copy() копирует заданный диапазон элементов одного массива в другой [4]
Array.Copy(str6,0,str5,1,6);
где str6 – массив, содержащий данные, которые требуется скопировать, далее 0 – целое, позиция в массиве str6, с которого начинается копирование, str5 – массив, принимающий данные, 1 – целое, индекс в массиве str5, с которого начинается сохранение, 6 – целое копируемых элементов [4].
Отметим, что здесь рассмотрены не все способы работы с массивами. Экземпляры класса массива можно удалить из кучи сборщиком мусора GC.Collect(). В работе затронуты базовые и основные понятия, на которые следует обратить при обучении языку C#. Приведены простые и информативные примеры работы с элементами массива типа значения и ссылочного типов.
ЛИТЕРАТУРА
- Павловская Т.А. C#. Программирование на языке высокого уровня. Учебник для вузов. – СПб.: Питер, 2009. – 432 с.
- URL:https://msdn.microsoft.com/ru-ru/library/4d43ts61(v=vs.90).aspx
- URL:http://professorweb.ru/my/csharp/charp_theory/level4/4_4.php
- URL:https://msdn.microsoft.com/ru-ru/library/z50k9bft(v=vs.110).aspx
Уважаемый Булат Ильгизович! Безусловно, что проблема, которую Вы ставите на обсуждение чрезвычайно актуальна — работа с массивами не является простой не только для школьников, но и для достаточно большого количества студентов.
Присоединяюсь к коллеге. Действительно сложная тема. Было бы интересно продолжить рассмотрение ее преподавания.