Передача параметра массива в C #: почему он передается неявно по ссылке?

Предположим, что следующий код без ключевого слова ref , очевидно, не заменит переданную переменную, поскольку она передана как значение .

class ProgramInt
{
    public static void Test(int i) // Pass by Value
    {
        i = 2; // Working on copy.
    }

    static void Main(string[] args)
    {
        int i = 1;
        ProgramInt.Test(i);
        Console.WriteLine(i);
        Console.Read();

        // Output: 1
    }
}

Теперь, чтобы эта функция работала должным образом, нужно добавить ключевое слово ref , как обычно:

class ProgramIntRef
{
    public static void Test(ref int i) // Pass by Reference
    {
        i = 2; // Working on reference.
    }

    static void Main(string[] args)
    {
        int i = 1;
        ProgramInt.Test(ref i);
        Console.WriteLine(i);
        Console.Read();

        // Output: 2
    }
}

Теперь я не понимаю, почему члены массива при передаче в функции неявно передаются по ссылке. . Разве это не массивы значений типов?

class ProgramIntArray
{
    public static void Test(int[] ia) // Pass by Value
    {
        ia[0] = 2; // Working as reference?
    }

    static void Main(string[] args)
    {
        int[] test = new int[] { 1 };
        ProgramIntArray.Test(test);
        Console.WriteLine(test[0]);
        Console.Read();

        // Output: 2
    }
}
7
задан Lazlo 30 August 2010 в 21:33
поделиться

5 ответов

Нет, массивы — это классы, то есть ссылочные типы.

16
ответ дан 6 December 2019 в 08:40
поделиться

Массивы не передаются по ссылке. Ссылки на массивы передаются по значению. Если необходимо изменить массив WHAT, на который указывает переданная переменная массива (например, изменить размер массива), переменная должна быть передана по ссылке.

2
ответ дан 6 December 2019 в 08:40
поделиться

Хороший способ запомнить это:

  • "ref" создает псевдоним для переменной
  • массив представляет собой набор переменных; каждый элемент является переменной.

При обычной передаче массива вы передаете набор переменных. Переменные в коллекции не изменяются.

Когда вы передаете массив с помощью «ref», вы даете новое имя переменной, содержащей массив.

Когда вы обычно передаете элемент массива, вы передаете значение переменной.

Когда вы передаете элемент массива - переменную - с помощью "ref", вы даете новое имя этой переменной.

Имеет смысл?

2
ответ дан 6 December 2019 в 08:40
поделиться

Кроме базовых типов данных, вы не можете передавать что-либо еще как передачу по значению. Массив представляет собой набор базовых типов данных, также допускающий передачу по значению в коллекции приведет к созданию нескольких копий коллекции, что будет плохо для представление.

0
ответ дан 6 December 2019 в 08:40
поделиться

Как указано в справке MSDN, массивы являются объектами (System.Array является абстрактным базовым типом всех массивов), а объекты передаются по ссылке.

0
ответ дан 6 December 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: