Добрый вечер!
Задача следующая: Дан так называемый ступенчатый(зубчатый) массив целых чисел
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
///
Казалось бы, что переменные типа 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, то метод работает так, как надо.
Ответ
Потому что она обменивает локальные переменные, а не параметры.
Параметры в C# передаются по значению, если не указано ref или out. Это относится и к параметрам ссылочного типа, при этом по значению передаётся ссылка
Попробуйте указать в сигнатуре функции ref
Что происходит в вашем коде? В функцию SwapMatrixStrings вы передали ссылочные выражения matrix[0] и matrix[1] в качестве аргументов. То есть, параметры a и b получили значение, совпадающее с matrix[0] и matrix[1] (то есть, их копии).
В результате выполнения вашей функции, значения a и b поменялись местами. Но это никак не затрагивает исходные величины matrix[0] и matrix[1]
Комментариев нет:
Отправить комментарий