Как передать массив в функцию си шарп
Во всех предыдущих примерах мы использовали постоянное число параметров. Но, используя ключевое слово params , мы можем передавать неопределенное количество параметров:
void Sum(params int[] numbers) < int result = 0; foreach (var n in numbers) < result += n; >Console.WriteLine(result); > int[] nums = < 1, 2, 3, 4, 5>; Sum(nums); Sum(1, 2, 3, 4); Sum(1, 2, 3); Sum();
Сам параметр с ключевым словом params при определении метода должен представлять одномерный массив того типа, данные которого мы собираемся использовать. При вызове метода на место параметра с модификатором params мы можем передать как отдельные значения, так и массив значений, либо вообще не передавать параметры. Количество передаваемых значений в метод неопределено, однако все эти значения должны соответствовать типу параметра с params .
Если же нам надо передать какие- то другие параметры, то они должны указываться до параметра с ключевм словом params:
void Sum(int initialValue, params int[] numbers) < int result = initialValue; foreach (var n in numbers) < result += n; >Console.WriteLine(result); > int[] nums = < 1, 2, 3, 4, 5>; Sum(10, nums); // число 10 - передается параметру initialValue Sum(1, 2, 3, 4); Sum(1, 2, 3); Sum(20);
Здесь метод Sum имеет обязательный параметр initialValue, поэтому при вызове метода для него нужно обязательно передать значение. Поэтому первое значение при вызове метода будет передаваться этому параметру.
Однако после параметра с модификатором params мы НЕ можем указывать другие параметры. То есть следующее определение метода недопустимо:
//Так НЕ работает void Sum(params int[] numbers, int initialValue) <>
Массив в качестве параметра
Также этот способ передачи параметров надо отличать от передачи массива в качестве параметра:
void Sum(int[] numbers, int initialValue) < int result = initialValue; foreach (var n in numbers) < result += n; >Console.WriteLine(result); > int[] nums = < 1, 2, 3, 4, 5>; Sum(nums, 10); // Sum(1, 2, 3, 4); // так нельзя - нам надо передать массив
Так как метод Sum принимает в качестве параметра массив без ключевого слова params , то при его вызове нам обязательно надо передать в качестве первого параметра массив. Кроме того, в отличие от метода с параметром params после параметра-массива могут располагаться другие параметры.
Как передать массив в функцию си шарп
Нужно передать массив в функцию, провести над ним некие действия и вернуть его обратно в метод Main.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FunctionArrayMy < class Program < static int[] PrintArray(int[] arr) < for (int i = 0; i < arr.Length; i++) < arr[i] = arr[i] * 2; >return arr; > static void Main() < int[] w = < 1, 2, 3, 4, 5, 6, 7>; int[] t;int i; t=PrintArray(w); for (i = 0; i < t.Length; i++) < Console.Write(t); Console.Write(' '); >Console.ReadLine(); > > >
Передал я вроде правильно, а вот возвращаться не хочет.
Подскажите что не так?
Последний раз редактировалось Gstar; 13.10.2012 в 15:06 .
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
Попробуй так return arr[0];
Регистрация: 13.10.2012
Сообщений: 8
Так не работает
Форумчанин
Регистрация: 14.12.2009
Сообщений: 716
Попробуй объявить локальный массив и выделить ему память и передать ему твой параметр и возвращать не параметр а этот локальный массив.
static int[] PrintArray(int[] arr) < int[] t_arr = new int [arr.Length]; t_arr = arr; for (int i = 0; i < t_arr.Length; i++) < t_arr[i] = t_arr[i] * 2; >return t_ arr; >
Последний раз редактировалось coNsept; 13.10.2012 в 15:16 .
Регистрация: 13.10.2012
Сообщений: 8
Сделал.
Console.Write(t) выводит попрежнему не то: SystenInt32[]
Форумчанин
Регистрация: 18.01.2012
Сообщений: 975
| Сделал. Console.Write(t) выводит попрежнему не то: SystenInt32[] |
Консоль выводит то, что вы ей даете. В данном случае она получает на вход переменную «t», и выводит «t.ToString()», унаследованный от базового «object».
И еще: если PrintArray должна отдавать новый массив, и не должна менять старый, то следует немного переписать метод:
static int[] PrintArray(int[] arr) < int[] res = new int[arr.Length]; for (int i = 0; i < arr.Length; i++) < res[i] = arr[i] * 2; >return res; >
Благодарить в репутацию. Проклинать — туда же
Последний раз редактировалось Luuzuk; 13.10.2012 в 15:51 .
Регистрация: 13.10.2012
Сообщений: 8
я туплю, ну как так можно? забыл написать «[i]» и пол дня мучаюсь!!
Вот так теперь все работает.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FunctionArrayMy < class Program < static int[] PrintArray(int[] arr) < int[] p=new int[arr.Length]; for (int i = 0; i < arr.Length; i++) < p[i] = arr[i] * 2; >return p; > static void Main() < int[] w = < 1, 2, 3, 4, 5, 6, 7>; int[] t;int i; t=PrintArray(w); for (i = 0; i < t.Length; i++) < Console.Write(t[i]); Console.Write(' '); >Console.ReadLine(); > > >
Передача массива в функцию
Если в си шарп массивы передаются по ссылке, почему после функции init «а» не указывает на новую область?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Передача массива в функцию
Здравствуйте, столкнулся с проблемой передачи массива в функцию. Проблема в том, что в функции z1.
Передача массива в функцию
Здравствуйте. Возник вопрос по передаче массивов в функцию.. Вот код: class Arr < //.

Передача массива в функцию
Здравствуйте! Подскажите, пожалуйста, как правильно сделать инициализацию и вывод массива двумя.
передача массива в функцию
есть массив double a = new double; double b = new double; как правильно вызвать? .
Регистрация: 30.01.2015
Сообщений: 120
Попробуй написать так:
static void init(out int[] a)
74 / 71 / 67
Регистрация: 18.09.2015
Сообщений: 234
То есть данные я изменять могу, а саму ссылку нет?
Регистрация: 30.01.2015
Сообщений: 120
Я не уверен, но вроде когда вы в метод передаёте массив, то для этого метода создаётся копия этого массива(типа локального массива для этого метода). В результате что бы вы не делали с массивом внутри метода, на оригинальный массив никак не действует
Добавлено через 40 секунд
Так же и с обычными переменными.
![]()
6384 / 3992 / 1590
Регистрация: 09.05.2015
Сообщений: 9,358

Сообщение было отмечено amaralikyr как решение
Решение
Сообщение от amaralikyr 
Если в си шарп массивы передаются по ссылке, почему после функции init «а» не указывает на новую область?
Потому что в метод передается копия ссылки, вы меняете копию ссылки, а не оригинальную ссылку.
2353 / 1771 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
Сообщение от amaralikyr 
а саму ссылку нет?
для передачи «ссылки по ссылке», используйте ключовое слово ref
Добавлено через 9 минут
Сообщение от Roma12 
Я не уверен, но вроде когда вы в метод передаёте массив, то для этого метода создаётся копия этого массива(типа локального массива для этого метода). В результате что бы вы не делали с массивом внутри метода, на оригинальный массив никак не действует
Добавлено через 40 секунд
Так же и с обычными переменными.
«обычные переменные», как вы выразились, являються типами значений, массив же являеться ссылочным типом.
При передаче массива в метод, происходит передача копии ссылки из стека, сам же массив храниться в куче.
Автор же в статическом методе создает новый массив, и присваивает этой копии ссылки этот новый массив. При выходе из метода, стек очищаеться, все ссылки на новый массив удаляються, в следствии чего массив будет подчищен GC.
Для того, что б все это с массивом работало, как с «обычными переменными», надо передать через ref
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
static void init(ref int[] a) { a = new[] { 1, 2, 3 }; } static void Main() { int[] a = { 3, 2, 1 }; init(ref a); Console.WriteLine(a[0]); Console.WriteLine(a[1]); Console.WriteLine(a[2]); //вывод 1 2 3 }
Массивы
В структуре данных массива можно хранить несколько переменных одного типа. Чтобы объявить массив, следует указать тип его элементов. Если требуется, чтобы массив мог хранить элементы любого типа, можно указать object в качестве его типа. В унифицированной системе типов C# все типы, стандартные и определяемые пользователем, ссылочные типы и типы значений напрямую или косвенно наследуются из Object.
type[] arrayName;
Массив имеет следующие свойства:
- Массив может быть одномерным, многомерным или многомерным.
- Число измерений задается при объявлении переменной массива. Длина каждого измерения устанавливается при создании экземпляра массива. Эти значения нельзя изменить во время существования экземпляра.
- Массив массивов является массивом массивов, и каждый массив элементов имеет значение null по умолчанию.
- Массивы индексируются от нуля: массив с n элементами индексируется от 0 до n-1 .
- Элементы массива могут иметь любой тип, в том числе тип массива.
- Типы массивов — это ссылочные типы, производные от абстрактного базового типа Array. Все массивы реализуют IList и IEnumerable. Для итерации по массиву можно использовать оператор foreach. Одномерные массивы также реализуют IList и IEnumerable .
Элементы массива можно инициализировать в известные значения при создании массива. Начиная с C# 12, все типы коллекций можно инициализировать с помощью выражения Collection. Элементы, которые не инициализированы, имеют значение по умолчанию. Значение по умолчанию — это 0-разрядный шаблон. Все ссылочные типы (включая типы, не допускающие значение NULL), имеют значения null . Все типы значений имеют 0-разрядные шаблоны. Это означает, Nullable.HasValue что свойство имеет false значение, и Nullable.Value свойство не определено. В реализации Value .NET свойство создает исключение.
В следующих примерах создаются одномерные массивы, многомерные массивы и массивы массивов:
// Declare a single-dimensional array of 5 integers. int[] array1 = new int[5]; // Declare and set array element values. int[] array2 = [1, 2, 3, 4, 5, 6]; // Declare a two dimensional array. int[,] multiDimensionalArray1 = new int[2, 3]; // Declare and set array element values. int[,] multiDimensionalArray2 = < < 1, 2, 3 >, < 4, 5, 6 >>; // Declare a jagged array. int[][] jaggedArray = new int[6][]; // Set the values of the first array in the jagged array structure. jaggedArray[0] = [1, 2, 3, 4];
Одномерные массивы
Одномерный массив — это последовательность таких элементов. Доступ к элементу осуществляется через его индекс. Индекс — это порядковое положение в последовательности. Первый элемент в массиве находится в индексе 0 . Для создания одномерного массива используется оператор new и указывается тип элементов массива и число элементов. В следующем примере объявляются и инициализируется одномерные массивы:
int[] array = new int[5]; string[] weekDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; Console.WriteLine(weekDays[0]); Console.WriteLine(weekDays[1]); Console.WriteLine(weekDays[2]); Console.WriteLine(weekDays[3]); Console.WriteLine(weekDays[4]); Console.WriteLine(weekDays[5]); Console.WriteLine(weekDays[6]); /*Output: Sun Mon Tue Wed Thu Fri Sat */
Первое объявление объявляет неинициализированный массив из пяти целых чисел от array[0] до array[4] . Элементы массива инициализируются до значения по умолчанию для типа элемента. Для целых чисел это 0 . Второе объявление объявляет массив строк и инициализирует все семь значений этого массива. Оператор foreach выполняет итерацию элементов массива weekday и выводит все значения. Для одномерных массивов оператор обрабатывает элементы в увеличении порядка индексов foreach , начиная с индекса 0 и заканчивая индексом Length — 1 .
Передача одномерных массивов в качестве аргументов
Инициализированный одномерный массив можно передать в метод. В следующем примере массив строк инициализируется и передается в качестве аргумента в метод DisplayArray для строк. Этот метод отображает элементы массива. Затем метод ChangeArray размещает элементы массива в обратном порядке, а метод ChangeArrayElements изменяет первые три элемента массива. После возврата каждого метода метод DisplayArray показывает, что передача массива по значению не препятствует изменению элементов массива.
class ArrayExample < static void DisplayArray(string[] arr) =>Console.WriteLine(string.Join(" ", arr)); // Change the array by reversing its elements. static void ChangeArray(string[] arr) => Array.Reverse(arr); static void ChangeArrayElements(string[] arr) < // Change the value of the first three array elements. arr[0] = "Mon"; arr[1] = "Wed"; arr[2] = "Fri"; >static void Main() < // Declare and initialize an array. string[] weekDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // Display the array elements. DisplayArray(weekDays); Console.WriteLine(); // Reverse the array. ChangeArray(weekDays); // Display the array again to verify that it stays reversed. Console.WriteLine("Array weekDays after the call to ChangeArray:"); DisplayArray(weekDays); Console.WriteLine(); // Assign new values to individual array elements. ChangeArrayElements(weekDays); // Display the array again to verify that it has changed. Console.WriteLine("Array weekDays after the call to ChangeArrayElements:"); DisplayArray(weekDays); >> // The example displays the following output: // Sun Mon Tue Wed Thu Fri Sat // // Array weekDays after the call to ChangeArray: // Sat Fri Thu Wed Tue Mon Sun // // Array weekDays after the call to ChangeArrayElements: // Mon Wed Fri Wed Tue Mon Sun
Многомерные массивы
Массивы могут иметь несколько измерений. Например, следующие объявления создают четыре массива: два имеют два измерения, два имеют три измерения. Первые два объявления объявляют длину каждого измерения, но не инициализировать значения массива. Во втором двух объявлениях используется инициализатор для задания значений каждого элемента в многомерном массиве.
int[,] array2DDeclaration = new int[4, 2]; int[,,] array3DDeclaration = new int[4, 2, 3]; // Two-dimensional array. int[,] array2DInitialization = < < 1, 2 >, < 3, 4 >, < 5, 6 >, < 7, 8 >>; // Three-dimensional array. int[,,] array3D = new int[,,] < < < 1, 2, 3 >, < 4, 5, 6 >>, < < 7, 8, 9 >, < 10, 11, 12 >> >; // Accessing array elements. System.Console.WriteLine(array2DInitialization[0, 0]); System.Console.WriteLine(array2DInitialization[0, 1]); System.Console.WriteLine(array2DInitialization[1, 0]); System.Console.WriteLine(array2DInitialization[1, 1]); System.Console.WriteLine(array2DInitialization[3, 0]); System.Console.WriteLine(array2DInitialization[3, 1]); // Output: // 1 // 2 // 3 // 4 // 7 // 8 System.Console.WriteLine(array3D[1, 0, 1]); System.Console.WriteLine(array3D[1, 1, 2]); // Output: // 8 // 12 // Getting the total count of elements or the length of a given dimension. var allLength = array3D.Length; var total = 1; for (int i = 0; i < array3D.Rank; i++) < total *= array3D.GetLength(i); >System.Console.WriteLine($" equals "); // Output: // 12 equals 12
Для многомерных массивов элементы пересекаются таким образом, что индексы самого правого измерения увеличиваются сначала, а затем следующее левое измерение и т. д. до самого левого индекса. В следующем примере перечисляется как 2D, так и трехмерный массив:
int[,] numbers2D = < < 9, 99 >, < 3, 33 >, < 5, 55 >>; foreach (int i in numbers2D) < System.Console.Write($""); > // Output: 9 99 3 33 5 55 int[,,] array3D = new int[,,] < < < 1, 2, 3 >, < 4, 5, 6 >>, < < 7, 8, 9 >, < 10, 11, 12 >> >; foreach (int i in array3D) < System.Console.Write($""); > // Output: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
В массиве 2D можно считать левый индекс строкой и правым индексом в качестве столбца .
Однако с многомерными массивами, используя вложенный цикл, вы можете более контролировать порядок обработки элементов массива:
int[,,] array3D = new int[,,] < < < 1, 2, 3 >, < 4, 5, 6 >>, < < 7, 8, 9 >, < 10, 11, 12 >> >; for (int i = 0; i < array3D.GetLength(0); i++) < for (int j = 0; j < array3D.GetLength(1); j++) < for (int k = 0; k < array3D.GetLength(2); k++) < System.Console.Write($""); > System.Console.WriteLine(); > System.Console.WriteLine(); > // Output (including blank lines): // 1 2 3 // 4 5 6 // // 7 8 9 // 10 11 12 //
Передача многомерных массивов в качестве аргументов
Инициализированный многомерный массив можно передать в метод так же, как и одномерный массив. В следующем коде показано разделяемое объявление метода печати, который принимает в качестве аргумента двухмерный массив. Новый массив можно инициализировать и передать за один шаг, как показано в следующем примере. В следующем примере инициализируется двухмерный массив целых чисел, который передается в метод Print2DArray . Этот метод отображает элементы массива.
static void Print2DArray(int[,] arr) < // Display the array elements. for (int i = 0; i < arr.GetLength(0); i++) < for (int j = 0; j < arr.GetLength(1); j++) < System.Console.WriteLine("Element(,)=", i, j, arr[i, j]); > > > static void ExampleUsage() < // Pass the array as an argument. Print2DArray(new int[,] < < 1, 2 >, < 3, 4 >, < 5, 6 >, < 7, 8 >>); > /* Output: Element(0,0)=1 Element(0,1)=2 Element(1,0)=3 Element(1,1)=4 Element(2,0)=5 Element(2,1)=6 Element(3,0)=7 Element(3,1)=8 */
Массивы массивов
Массив массивов — это массив, элементы которого являются массивами и могут быть различных размеров. Многообразный массив иногда называется массивом массивов. Его элементы являются ссылочными типами и инициализированы в null . В следующих примерах показано, как объявлять и инициализировать массивы массивов, а также получать доступ к ним. Первый пример объявляется jaggedArray в одной инструкции. Каждый содержащийся массив создается в последующих инструкциях. Второй пример jaggedArray2 объявлен и инициализирован в одной инструкции. Массивы массивов и многомерные массивы можно смешивать. Последним примером jaggedArray3 является объявление и инициализация одномерного массива, содержащего три двухмерных элемента массива разных размеров.
int[][] jaggedArray = new int[3][]; jaggedArray[0] = [1, 3, 5, 7, 9]; jaggedArray[1] = [0, 2, 4, 6]; jaggedArray[2] = [11, 22]; int[][] jaggedArray2 = [ [1, 3, 5, 7, 9], [0, 2, 4, 6], [11, 22] ]; // Assign 77 to the second element ([1]) of the first array ([0]): jaggedArray2[0][1] = 77; // Assign 88 to the second element ([1]) of the third array ([2]): jaggedArray2[2][1] = 88; int[][,] jaggedArray3 = [ new int[,] < , >, new int[,] < , , >, new int[,] < , , > ]; Console.Write("", jaggedArray3[0][1, 0]); Console.WriteLine(jaggedArray3.Length);
Элементы массива должны быть инициализированы перед их использованием. Каждый из элементов является массивом. Кроме того, можно использовать инициализаторы для заполнения элементов массива значениями. При использовании инициализаторов не требуется размер массива.
В этом примере создается массив, элементы которого являются массивами. Все элементы массива имеют разный размер.
// Declare the array of two elements. int[][] arr = new int[2][]; // Initialize the elements. arr[0] = [1, 3, 5, 7, 9]; arr[1] = [2, 4, 6, 8]; // Display the array elements. for (int i = 0; i < arr.Length; i++) < System.Console.Write("Element(): ", i); for (int j = 0; j < arr[i].Length; j++) < System.Console.Write("", arr[i][j], j == (arr[i].Length - 1) ? "" : " "); > System.Console.WriteLine(); > /* Output: Element(0): 1 3 5 7 9 Element(1): 2 4 6 8 */
Неявно типизированные массивы
Можно создать неявно типизированный массив, в котором тип экземпляра массива выводится из элементов, указанных в инициализаторе массива. Правила для любой неявно типизированной переменной также применяются к неявно типизированным массивам. Дополнительные сведения см. в разделе Неявно типизированные локальные переменные.
В следующих примерах показано, как создать неявно типизированный массив:
int[] a = new[] < 1, 10, 100, 1000 >; // int[] // Accessing array Console.WriteLine("First element: " + a[0]); Console.WriteLine("Second element: " + a[1]); Console.WriteLine("Third element: " + a[2]); Console.WriteLine("Fourth element: " + a[3]); /* Outputs First element: 1 Second element: 10 Third element: 100 Fourth element: 1000 */ var b = new[] < "hello", null, "world" >; // string[] // Accessing elements of an array using 'string.Join' method Console.WriteLine(string.Join(" ", b)); /* Output hello world */ // single-dimension jagged array int[][] c = [ [1,2,3,4], [5,6,7,8] ]; // Looping through the outer array for (int k = 0; k < c.Length; k++) < // Looping through each inner array for (int j = 0; j < c[k].Length; j++) < // Accessing each element and printing it to the console Console.WriteLine($"Element at c[][] is: "); > > /* Outputs Element at c[0][0] is: 1 Element at c[0][1] is: 2 Element at c[0][2] is: 3 Element at c[0][3] is: 4 Element at c[1][0] is: 5 Element at c[1][1] is: 6 Element at c[1][2] is: 7 Element at c[1][3] is: 8 */ // jagged array of strings string[][] d = [ ["Luca", "Mads", "Luke", "Dinesh"], ["Karen", "Suma", "Frances"] ]; // Looping through the outer array int i = 0; foreach (var subArray in d) < // Looping through each inner array int j = 0; foreach (var element in subArray) < // Accessing each element and printing it to the console Console.WriteLine($"Element at d[][] is: "); j++; > i++; > /* Outputs Element at d[0][0] is: Luca Element at d[0][1] is: Mads Element at d[0][2] is: Luke Element at d[0][3] is: Dinesh Element at d[1][0] is: Karen Element at d[1][1] is: Suma Element at d[1][2] is: Frances */
В предыдущем примере обратите внимание, что с неявно типизированными массивами квадратные скобки не используются слева от инструкции инициализации. Кроме того, многомерные массивы инициализированы так new [] же, как и одномерные массивы.
При создании анонимного типа, содержащего массив, этот массив необходимо неявно типизировать в инициализаторе объекта типа. В следующем примере contacts представляет собой неявный типизированный массив анонимных типов, каждый из которых содержит массив с именем PhoneNumbers . Ключевое var слово не используется внутри инициализаторов объектов.
var contacts = new[] < new < Name = " Eugene Zabokritski", PhoneNumbers = new[] < "206-555-0108", "425-555-0001" >>, new < Name = " Hanying Feng", PhoneNumbers = new[] < "650-555-0199" >> >;
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
