#c_sharp #массивы #net
Добрый вечер! Задача следующая: Дан так называемый ступенчатый(зубчатый) массив целых чисел int[][] matrix. Для определенности, пусть массив будет размерности 5: int[][] matrix = new int[5][] { new int[10] {5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, new int[4] {2, 2, 2, 2}, new int[5] {20, 20, 20, 20, 20}, new int[3] {1, 2, 1}, new int[4] { 2, 3, 4, 5 } } Необходимо поменять две любые строки между собой. Для этого я написал следующую функцию Swap: ////// Swapping matrix strings /// /// first string /// second string private static void SwapMatrixStrings(int[] a, int[] b) { int[] tmp = a; a = b; b = tmp; } Казалось бы, что переменные типа int[] - это переменные ссылочного типа. Но почему тогда после вызова: Swap(matrix[0], matrix[1]); массив int[4] {2, 2, 2, 2} не поменялся местами с массивом int[10] {5, 5, 5, 5, 5, 5, 5, 5, 5, 5} в массиве matrix? UPD. Если в методе передавать параметры по ссылке с помощью ключевого слова ref, то метод работает так, как надо.
Ответы
Ответ 1
Потому что она обменивает локальные переменные, а не параметры. Параметры в C# передаются по значению, если не указано ref или out. Это относится и к параметрам ссылочного типа, при этом по значению передаётся ссылка. Попробуйте указать в сигнатуре функции ref. Что происходит в вашем коде? В функцию SwapMatrixStrings вы передали ссылочные выражения matrix[0] и matrix[1] в качестве аргументов. То есть, параметры a и b получили значение, совпадающее с matrix[0] и matrix[1] (то есть, их копии). В результате выполнения вашей функции, значения a и b поменялись местами. Но это никак не затрагивает исходные величины matrix[0] и matrix[1].
Комментариев нет:
Отправить комментарий