Страницы

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

суббота, 7 марта 2020 г.

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

#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].

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

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