#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].
Комментариев нет:
Отправить комментарий