Скачиваний:
2
Добавлен:
04.09.2023
Размер:
1.17 Mб
Скачать

16 Функции в языке с#

Создание и использование функций. Аргументы функции

Функция main является главной функцией приложения и точкой входа программы. Любая функция в Си-шарп может быть объявлена только в рамках класса. Объявление пользовательской функции внутри другой функции (например, main) недопустимо. Объявление функции имеет следующую структуру:

[модификатор доступа] [тип возвращаемого значения] [имя функции] ([аргументы])

{

// тело функции

}

Модификатор доступа (области видимости) может быть public, private, protected, internal.

Между модификатором и типом может стоять ключевое слово static, что означает, что функция будет статичной. Из статичной функции можно вызывать другие функции, если они тоже статичные. Главная функция main – всегда static.

Функция может возвращать значение или не возвращать. Если функция, например, возвращает целое число, то нужно указать тип int. Если функция не возвращает никакого значения, то для этого используется ключевое слово void. Функции, которые не возвращают значение, называют процедурами.

По умолчанию при передаче в метод экземпляра типа значения вместо самого этого экземпляра передается его копия. Поэтому изменения в аргументе не оказывают влияния на исходный экземпляр в вызывающем методе. Чтобы передать экземпляр типа значения по ссылке, используется ключевое слово ref.

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

Ключевое слове return также останавливает выполнение метода. Если тип возврата — void, инструкцию return без значения по-прежнему можно использовать для завершения выполнения метода. Без ключевого слова return этот метод будет останавливать выполнение при достижении конца блока кода. Методы с типом возврата, отличным от void, должны использовать ключевое слово return для возврата значения.

Аргументы – это те данные, которые необходимы для выполнения функции. Аргументы записываются в формате [тип] [идентификатор]. Если аргументов несколько, они отделяются запятой. Аргументы могут отсутствовать.

Параметры и аргументы функции

Определение метода задает имена и типы всех необходимых параметров. Когда вызывающий код вызывает метод, он предоставляет конкретные значения, называемые аргументами, для каждого параметра. Аргументы должны быть совместимы с типом параметра, но имя аргумента (если есть), используемое в вызывающем коде, не обязательно должно совпадать с именем параметра, указанным в методе.

Первая строка функции, где указываются тип, имя, аргументы и т.д. называется заголовком функции.

17 Массивы. Создание и инициализация. Ссылки на массив. Двухмерные и многомерные массивы. Инициализация массивов. Невыровненные массивы.

Массив – это конечная группа элементов одного типа, имеющая общее имя.

1. Массивы относятся к ссылочным типам данных. Это значит, что в стеке хранится ссылка на выделенное пространство для элементов массива в куче/хипе/динамической памяти. Важно понимать, что массив хранится как последовательный набор элементов (значения идут тупо друг за другом), в то время как очень похожий на него список может быть хаотично разбросан по всей динамической памяти вперемешку с остальными ссылочными данными. В каждом элементе списка есть адрес, где найти следующий элемент. Получается, что адреса элементов массивов известны, можно сказать хочу 4ый элемент такого-то массива и получить его БЫСТРО, а в списках мы говорим, чтобы получить 4ый элемент найди первый, в нем адрес второго, во втором адрес третьего и там ты найдешь свой четвертый элемент, что ДОЛГО.

Динамическая память

Массив

1

2

3

4

5

Динамическая память

Лист

3 (замыкающий элемент)

какой-то инородный элемент

1 + адрес следующего значения (2ки)

2 + адрес следующего значения (3ки)

какой-то инородный элемент

2. Массивы построены на основе класса System.Array, поэтому любой массив получает методы и свойства класса Array, что значительно упрощает работу с массивами.

3. Работа с массивами более безопасна, поскольку контролируется выход за границы массива.

4. По умолчанию элементам массива присваиваются начальные значения.

Начальные значения:

• для арифметических типов - 0,

• для ссылочных типов - null,

• для символов - пробел.

• для логических – false

Имеются одномерные, многомерные и ступенчатые массивы.

Одномерный массив

тип[] имя_массива = new тип [размер];

Например: int[] a=new int [10]; это значит, что длина массива равна 10, а внутри массива будет десять нулей, т.к. для арифметических типов значение по умолчанию 0.

Возможно объявление массива с инициализацией значений:

тип [] имя _массива=new тип [размер] {список инициализированных значений};

Например: int[] a= new int[4] {0, 1, 2, 3};

Но, если мы инициализируем какие-то значения сами, то код можно сократить: убрать размер, тип и даже ключевое слово new.

Пример: int[] a = { 1, 2, 3, 5 };

Многомерный массив

Массивы характеризуются таким понятием как ранг или количество измерений. Выше мы рассматривали массивы, которые имеют одно измерение (то есть их ранг равен 1) - такие массивы можно представлять в виде горзонтального ряда элемента. Но массивы также бывают многомерными. У таких массивов количество измерений (то есть ранг) больше 1.

Массивы, которые имеют два измерения (ранг равен 2) называют двухмерными.

Например, создадим одномерный и двухмерный массивы, которые имеют одинаковые элементы:

int[] nums1 = new int[6] { 0, 1, 2, 3, 4, 5 };

0

1

2

3

4

5

int[,] nums2 = new int[2,3] { { 0, 1, 2 }, { 3, 4, 5 } };

0

1

2

3

4

5

Объявить двумерный массив можно одним из предложенных способов:

тип [,] a = new тип [размер 1, размер 2] {{эл - ты 1-ой строки}, … , {эл-ты n-ой строки}};

тип [,] a ={{эл - ты 1-ой строки}, … , {эл-ты n-ой строки}};

Аналогично одномерному, мы можем не писать размеры ( int[,]), тип ( [,]) и даже ключевое слово new.

Ступенчатые массивы / Невыровненные массивы / Зубчатые массивы

Иначе говоря, массив массивов. Ступенчатый массив объявляется с помощью идущих друг за другом пар квадратных скобок. Всегда задается столько пар квадратных скобок, сколько размерностей у массива.

Определение ступенчатых массивов:

int[][] arr = new int [3][]; // Объявляем ступенчатый массив

Размерность = 2, соответственно две пары кв. скобок - [][]. Внешнее измерение равно 3, значит в него войдет три каких-то массива (одномерных или многомерных). Последняя пара скобок [] – значит состоит из одномерных, если бы была [ , ] – был бы набор двумерных, ну и так далее [ , , ] – уже набор трехмерных.

Дальше задаем элементы ступенчатого массива:

arr[0] = new int[3]; // Определяем нулевой элемент

arr[1] = new int[2]; // Определяем первый элемент

arr[2] = new int[5]; // Определяем второй элемент

Каждый элемент представляет собой одномерный массив целых чисел. Первый элемент массива состоит из трех целях чисел, второй – из двух и третий – из пяти.

Внутреннее измерение при объявлении не указывается, поскольку в отличие от прямоугольного массива, в невыровненном каждый внутренний массив может иметь разную длину. Каждому внутреннему массиву автоматически присваивается значение null, а не пустой массив, и поэтому каждый внутренний массив нужно объявлять отдельно.