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

StackOverflow https://stackoverflow.com/questions/3604397

Вопрос

Предположим, следующий код, без каких-либо 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
    }
}

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

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
    }
}
Это было полезно?

Решение

Нет, массивы - это классы, что означает, что они являются ссылочными типами.

Другие советы

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

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

  • "ref" делает псевдоним к А. Переменная
  • Массив является Коллекция переменных; Каждый элемент является переменной.

Когда вы передаете массив нормально, вы проходите Коллекция переменных. Отказ Переменные в коллекции не меняются.

Когда вы проходите массив с «ref», то вы Давая новое имя в переменной, которая содержит массив.

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

Когда вы проходите элемент массива - переменная - с «ref», вы давая новое имя для этой переменной.

Иметь смысл?

Можете ли вы представить, пройдя 2 миллиона элементов элемента по значению? Теперь представьте, что тип элемента decimal. Отказ Вам придется копировать вокруг 240 МБ 30,5175781 МБ данных.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top