Передача массивов в методы по значению. Примеры передачи массивов базовых типов. Передача массивов структур, классов, перечислений в методы. Передача двумерных массивов в методы. Возврат массива из метода
В данной теме демонстрируется передача по значению массивов разных типов и размерностей.
Содержание
- 1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?
- 2. Пример передачи массива целых (ulong) чисел в метод
- 3. Пример передачи в метод массива чисел типа double
- 4. Пример передачи одномерного массива структур в метод
- 5. Пример передачи одномерного массива классов в метод
- 6. Пример передачи одномерного массива перечислений в метод
- 7. Пример передачи двумерного массива целых (int) чисел в метод
- 8. Пример передачи двумерного массива классов в метод
- 9. Пример возврата одномерного массива целых чисел (int) из метода
- 10. Пример возврата двумерного массива типа double из метода
- 11. Пример возврата двумерного массива классов из метода
- 12. Пример передачи двумерного ступенчатого массива в метод
- Связанные темы
Поиск на других ресурсах:
1. Как передать массив в метод? Какая общая форма передачи одномерного массива в метод?
Общая форма передачи одномерного массива в метод имеет следующий вид:
access return_type MethodName(type[] parameterName)
{
// ...
}
где
- access – модификатор доступа (public, protected, private);
- return_type – тип, возвращаемый методом;
- MethodName – название метода;
- type – тип массива, который передается в метод;
- parameterName – название массива, который есть формальным параметром метода MethodName.
⇑
2. Пример передачи массива целых (ulong) чисел в метод
В примере продемонстрирован метод ReverseArray, который реверсирует массив чисел типа ulong. Метод получает параметром массив items типа ulong.
// метод, который получает массив items и реверсирует его public void ReverseArray(ulong[] items) { ulong t; // реверсирование массива for (int i = 0; i < items.Length / 2; i++) { t = items[i]; items[i] = items[items.Length - i - 1]; items[items.Length - i - 1] = t; } return; }
Использование метода в другом программном коде может быть следующим:
ulong[] Array = { 2, 3, 1, 2, 8, 5, 6, 100 }; ReverseArray(Array); // Array = { 100, 6, 5, 8, 2, 1, 3, 2 }
⇑
3. Пример передачи в метод массива чисел типа double
Реализован метод, который получает массив чисел типа double в качестве параметра. Метод возвращает сумму элементов массива.
static public double SumDoubleArray(double[] items) { double sum = 0; for (int i = 0; i < items.Length; i++) sum += items[i]; return sum; }
Использование метода в другом программном коде может быть следующим:
double[] Array = { 3.3, 2.2, 1.1, 7.7, 8.8 }; double sum; sum = SumDoubleArray(Array); // sum = 23.1
⇑
4. Пример передачи одномерного массива структур в метод
Задана структура Country, описывающая информацию о стране
// структура, которая содержит информацию о стране struct Country { public string Name; // название страны public ulong Population; // население public string Capital; // название столицы public double Area; // площадь, в квадратных километрах }
Реализация метода MaxPopulation(), определяющего страну, с наибольшим населением. Метод получает массив структур Country.
// метод, получающий массив структур типа Country // метод возвращает структуру, которая содержит информацию о стране с наибольшим населением public Country MaxPopulation(Country[] countries) { int i; int numMax; double maxPopulation; if (countries.Length == 0) { Console.WriteLine("Не задан перечень стран"); return new Country(); } maxPopulation = countries[0].Population; numMax = 0; // for (i = 1; i < countries.Length; i++) if (countries[i].Population > maxPopulation) { maxPopulation = countries[i].Population; numMax = i; } return countries[numMax]; }
Демонстрация вызова метода MaxPopulation() из другого программного кода
Country[] countries = new Country[3]; // выделить память для трех структур типа Country Country cn; countries[0].Name = "Ghana"; countries[0].Capital = "Accra"; countries[0].Area = 238537.0; countries[0].Population = 25199609; countries[1].Name = "Republic of South Africa"; countries[1].Capital = "Pretoria"; countries[1].Population = 54956900; countries[1].Area = 1219912.0; countries[2].Name = "Madagascar"; countries[2].Capital = "Antananarivo"; countries[2].Population = 23812681; countries[2].Area = 587041.0; // вызов метода MaxPopulation(), передача массива структур в метод cn = MaxPopulation(countries); // cn.Name = "Republic of South Africa"
⇑
5. Пример передачи одномерного массива классов в метод
Задан класс Cylinder, реализующий цилиндр
// класс, который реализует цилиндр class Cylinder { double r; double h; // конструкторы public Cylinder() { r = 1; h = 1; } public Cylinder(double _r, double _h) { r = _r; h = _h; } // методы доступа public void Set(double _r, double _h) { r = _r; h = _h; } public void Get(out double _r, out double _h) { _r = r; _h = h; } // метод, который определяет объем цилиндра public double Volume() { return 3.1415 * r * r * h; } }
Реализация метода GetMaxVolumeCylinder, получающего массив Cylinders. Метод возвращает порядковый номер элемента массива (цилиндра), который имеет наибольший объем
// метод, который получает массив классов типа Cylinder и определяет номер цилиндра с наибольшим объемом static int GetMaxVolumeCylinder(Cylinder[] cylinders) { double maxV = cylinders[0].Volume(); int maxN = 0; for (int i=1; i<cylinders.Length; i++) if (maxV < cylinders[i].Volume()) { maxV = cylinders[i].Volume(); maxN = i; } return maxN; }
Использование метода GetMaxVolumeCylinder() в другом методе
Cylinder[] cl; // ссылка на массив классов типа Cylinder cl = new Cylinder[3]; // выделение памяти для 3 ссылок на тип Cylinder // выделить память для каждого элемента массива типа Cylinder for (int i = 0; i < cl.Length; i++) cl[i] = new Cylinder(); // cl[0].Set(2, 3.5); cl[1].Set(1.5, 2.8); cl[2].Set(3, 4.4); int num = GetMaxVolumeCylinder(cl); // num = 2
⇑
6. Пример передачи одномерного массива перечислений в метод
Дана структура DayWeek, определяющая день недели
// дни недели enum DayWeek { Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun }
Ниже реализован метод GetDayOff(), который получает массив типа DayWeek в качестве параметра. Метод определяет количество выходных дней (суббота, воскресенье) в массиве DayWeek.
// метод, определяющий количество выходных в массиве mn static int GetDayOff(DayWeek[] mn) { int nDayOff = 0; for (int i=0; i<mn.Length; i++) { if (mn[i] == DayWeek.Sat) nDayOff++; if (mn[i] == DayWeek.Sun) nDayOff++; } return nDayOff; }
Демонстрация использования метода GetDayOff() из другого программного кода может быть следующей:
// массив типа DayWeek DayWeek[] dw = new DayWeek[5]; // заполнение массива dw значениями dw[0] = DayWeek.Sun; // выходной dw[1] = DayWeek.Fri; dw[2] = DayWeek.Mon; dw[3] = DayWeek.Sat; // выходной dw[4] = DayWeek.Tue; int nDayOff; nDayOff = GetDayOff(dw); // nDayOff = 2
⇑
7. Пример передачи двумерного массива целых (int) чисел в метод
В примере демонстрируется передача двумерного массива методу Sum(). В качестве параметров метод Sum() получает:
- двумерный массив целых чисел с именем mn;
- количество строк m в массиве;
- количество столбцов n в массиве.
Метод находит сумму элементов двумерного массива.
// метод получает двумерный массив целых чисел // параметры m, n - количество строк и столбцов в массиве int Sum(int[,] mn, int m, int n) { int sum = 0; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) sum += mn[i,j]; return sum; }
Чтобы корректно обращаться к элементам массива, в метод нужно передать количество строк m и столбцов n. Использование метода Sum() в другом программном коде
// объявление массива arr int[,] arr = new int[3, 4]; // заполнение массива произвольными значениями for (int i = 0; i < 3; i++) for (int j = 0; j < 4; j++) arr[i, j] = i + j; // вызов метода Sum, которому передается массив arr int s = Sum(arr, 3, 4); // sum = 30
⇑
8. Пример передачи двумерного массива классов в метод
Пусть задан класс, который реализует цвет и прозрачность пиксела на экране. Объявление класса имеет следующий вид
// класс, который реализует цвет и прозрачность пиксела на экране class ColorPixel { int color; int transp; // прозрачность в % // конструкторы класса public ColorPixel() { color = transp = 0; } public ColorPixel(int _color, int _transp) { color = _color; transp = _transp; } // методы доступа public int GetColor() { return color; } public int GetTransp() { return transp; } public void Set(int _color, int _transp) { color = _color; transp = _transp; } }
Демонстрируется объявление метода SetArrayColor(), устанавливающего цвет и прозрачность в двумерном массиве классов типа ColorPixel.
// установить в массиве cp новые значения цвета и прозрачности static void SetArrayColor(int m, int n, ColorPixel[,] cp, int _color, int _transp) { for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) cp[i, j].Set(_color, _transp); return; }
Использование метода в другом программном коде может быть следующим
// создать новый массив классов ColorPixel int m = 3, n = 5; ColorPixel[,] CP = new ColorPixel[m, n]; // выделить память для массива ссылок // выделить память для каждого элемента массива for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) CP[i, j] = new ColorPixel(); // установить конкретное значение цвета 5 и прозрачности 50% во все ячейки массива SetArrayColor(m, n, CP, 5, 50);
⇑
9. Пример возврата одномерного массива целых чисел (int) из метода
Демонстрируется метод, который возвращает массив целых чисел (int[]). Метод заполняет элементы массива значениями, которые есть квадратами позиций (индексов) массива. Метод получает входным параметром размер массива n.
// метод, который генерирует одномерный массив целых чисел // элементы массива есть квадратами позиций массива static public int[] GetArray(int n) { int[] temp = new int[n]; // выделить память для массива // заполнить массив значениями for (int i = 0; i < n; i++) temp[i] = i * i; return temp; }
Вызов метода из другого программного кода может быть следующим
int[] A; // объявить ссылку на массив A A = GetArray(5); // A = { 0, 1, 4, 9, 16 }
⇑
10. Пример возврата двумерного массива типа double из метода
Демонстрируется возврат двумерного массива из метода. Метод GetDoubleArray() получает входным параметром размер массива m*n. Метод возвращает массив.
// метод, который генерирует двумерный массив целых чисел // размер массива m * n public double[,] GetDoubleArray(int m, int n) { // создать новый массив и выделить память для него double[,] temp = new double[m, n]; // заполнение массива значениями for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) temp[i, j] = j + i; return temp; }
Использование метода GetDoubleArray() в другом программном коде
double[,] D; D = GetDoubleArray(5, 6); double x; x = D[1, 3]; // x = 4.0 x = D[2, 5]; // x = 7.0 x = D[0, 0]; // x = 0.0
⇑
11. Пример возврата двумерного массива классов из метода
Пусть задан класс, который реализует символ типа char. В классе есть внутренняя переменная, конструктор и методы, которые определяют принадлежность символа к некоторой категории символов.
// класс, который демонстрирует символ class Char { char symbol; // внутренняя переменная // конструктор класса public Char(char _symbol) { symbol = _symbol; } // методы доступа public void Set(char _symbol) { symbol = _symbol; } public char Get() { return symbol; } // дополнительные методы // определяет, есть ли символ типа Char цифрой public bool IsNumber() { if ((symbol >= '0') && (symbol <= '9')) return true; return false; } // определяет, есть ли символ типа Char буквой латинского алфавита public bool IsLetter() { if ((symbol >= 'a') && (symbol <= 'z')) return true; if ((symbol >= 'A') && (symbol <= 'Z')) return true; return false; } // определяет, есть ли символ типа Char пробелом public bool IsSpace() { return symbol == ' '; } }
Реализация метода GetArrayChar(), который генерирует (возвращает) двумерный массив объектов типа Char
// метод, который возвращает двумерный массив классов Char // метод генерирует произвольные символы // m, n - размерность массива Char[,] GetArrayChar(int m, int n) { Char[,] tempArray = new Char[m, n]; // выделить память для массива ссылок типа Char int value; // сформировать массив termpArray for (int i=0; i<m; i++) for (int j=0; j<n; j++) { value = i + j; // значение, которое будет заноситься в массив if (value > 255) value -= 255; // выделить память для элемента массива + инициализировать значением value tempArray[i, j] = new Char((char)value); } return tempArray; }
Демонстрация вызова метода GetArrayChar() из другого программного кода
// создать новый массив классов Char int m = 3, n = 5; Char[,] Array; // объявить объект типа двумерный массив Char // вызвать метод, который будет формировать массив Array Array = GetArrayChar(8, 9);
⇑
12. Пример передачи двумерного ступенчатого массива в метод
В примере демонстрируется передача в метод и возврат из метода двумерного ступенчатого массива целочисленных величин.
Метод CopyIntArray() получает входными параметрами количество строк m в ступенчатом массиве A и сам ступенчатый массив A. Метод возвращает ступенчатый массив B, который есть копией массива A. Ступенчатый массив B размещается в другой области памяти
// метод, копирует входной ступенчатый массив в другой ступенчатый массив // m - количество строк в ступенчатом массиве // результат помещается в другой массив, который размещается в другой области памяти int[][] CopyIntArray(int m, int[][] A) { // объявить другой массив int[][] B = new int[m][]; // выделить память для ссылок на строки массива for (int i = 0; i < m; i++) { // выделить память для строки с номером i B[i] = new int[A[i].Length]; // Array[i].Length - количество элементов в строке i for (int j = 0; j < A[i].Length; j++) B[i][j] = A[i][j]; } return B; }
Демонстрация использования метода CopyIntArray() для копирования массивов следующая
// создать новый ступенчатый массив int m = 4; // количество строк в массиве int[][] A = new int[4][]; // исходный массив int[][] B; // результирующий массив // 1. Сформировать массив A // выделить память для массива A A[0] = new int[5]; // в строке 0 есть 5 элементов A[1] = new int[3]; A[2] = new int[4]; A[3] = new int[2]; // записать в массив A произвольные значения for (int i = 0; i < m; i++) for (int j = 0; j < A[i].Length; j++) A[i][j] = i + j; // 2. Вызвать метод, который копирует массив A в массив B B = CopyIntArray(m, A); // B <= A // 3. Вывести на экран массив B for (int i = 0; i < m; i++) { Console.Write("B[{0}] = ", i); for (int j = 0; j < B[i].Length; j++) Console.Write("{0} ", B[i][j]); Console.WriteLine(" "); }
В результате выполнения вышеприведенного кода, на экран будет выведен следующий результат
B[0] = 0 1 2 3 4 B[1] = 1 2 3 B[2] = 2 3 4 5 B[3] = 3 4 Press any key to continue . . .
⇑
Связанные темы
- Передача параметров в метод. Аргументы и формальные параметры. Примеры. Передача ссылки на объект класса в метод
- Модификаторы параметров ref и out. Примеры. Отличия между модификаторами ref и out
- Переменное количество аргументов в методах. Модификатор params. Преимущества. Примеры методов с переменным количеством аргументов
- Необязательные аргументы. Преимущества. Примеры применения необязательных аргументов. «Неоднозначность» в необязательных аргументах
- Именованные аргументы. Преимущества. Примеры