Страницы

Поиск по вопросам

четверг, 23 мая 2019 г.

C# и .Net. Почему пользовательская функция Swap работает неправильно?

Добрый вечер!
Задача следующая: Дан так называемый ступенчатый(зубчатый) массив целых чисел 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, то метод работает так, как надо.


Ответ

Потому что она обменивает локальные переменные, а не параметры. Параметры в C# передаются по значению, если не указано ref или out. Это относится и к параметрам ссылочного типа, при этом по значению передаётся ссылка
Попробуйте указать в сигнатуре функции ref

Что происходит в вашем коде? В функцию SwapMatrixStrings вы передали ссылочные выражения matrix[0] и matrix[1] в качестве аргументов. То есть, параметры a и b получили значение, совпадающее с matrix[0] и matrix[1] (то есть, их копии).
В результате выполнения вашей функции, значения a и b поменялись местами. Но это никак не затрагивает исходные величины matrix[0] и matrix[1]

Комментариев нет:

Отправить комментарий