Является ли int [] ссылочным типом или типом значения?

Я знаю, что int - это тип значения, но что такое массивы типов значений? Типы ссылок? Типы значений? Я хочу передать массив функции, чтобы что-то проверить. Должен ли я просто передать массив, поскольку он просто передаст ссылку, или я должен передать его как ref?

Ответ 1

Массивы - это механизмы, которые позволяют вам рассматривать несколько предметов как одно коллекция. Общий раздел Microsoft®.NET Язык Runtime (CLR) поддерживает одномерные массивы, многомерные массивы и зубчатые массивы (массивы массивов). Все массивы типы неявно получены из System.Array, который сам выводится из System.Object. Это значит, что все массивы всегда являются ссылочными типамикоторые распределяются по управляемым куча, и ваша переменная app содержит ссылка на массив, а не массив.

https://msdn.microsoft.com/en-us/library/bb985948.aspx

Ответ 2

Простейшим тестом для типа ссылочного типа по отношению к типу значения является то, что ссылочные типы могут быть null, но типы значений не могут.

Ответ 3

Массивы (даже такие типы значений, как int) являются ссылочными типами в С#.

http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx:

В С# массивы фактически являются объектами. System.Array - это абстрактный базовый тип всех типов массивов.

Ответ 4

Сначала я хочу сказать вам, что массив является ссылочным типом. Зачем? Я объясню, например, один пример.

Пример:

int val = 0; // this is a value type ok
int[] val1 = new int[20] // this is a reference type because space required to store 20 integer value that make array allocated on the heap.

Также ссылочные типы могут быть нулевыми, а типы значений не могут.

тип значения, хранящийся в Stack и ссылочном типе, хранящемся в Heap

Вы можете передать массив функции, используя out или ref. Только методы инициализации различны.

подробнее..

Ответ 5

Сам массив является ссылочным типом. Значения этого массива являются значениями или ссылочными типами, определяемыми типом данных массива. В вашем примере массив является ссылочным типом, а значения представляют собой типы значений.

Все одномерные массивы неявно реализуют IList<T>, где <T> - тип данных массива. Вы можете использовать этот интерфейс как тип данных вашего параметра метода. Вы также можете использовать IEnumerable<T> для типа данных. В любом случае (или даже если вы просто используете int[]), вам не нужно явно передавать его как параметр ref.

Ответ 6

Проверить, является ли эта ссылка или тип значения:

// we create a simple array of int
var a1 = new int[]{1,2,3};
// copy the array a1 to a2
var a2 = a1;
// modify the first element of a1
a1[0]=2;
// output the first element of a1 and a2
Console.WriteLine("a1:"+a1[0]); // 2
Console.WriteLine("a2:"+a2[0]); // 2
//**************************
// all the two variable point to the same array
// it reference type!
//**************************

Вы можете проверить его онлайн: https://dotnetfiddle.net/UWFP45

Ответ 7

//Ссылка на массив передается по значению. Это источник путаницы:-) ...

        int[] test = { 1, 2, 3, 4 };

        modifContenuSansRef(test);
        Console.WriteLine(test[0]); // OK --> 99 le contenu du tableau est modifié

        modifTailleSansRef(test);
        Console.WriteLine(test.Length); // KO --> 4 La taille n'est pas modifiée

    }

    static void modifContenuSansRef(int[] t)
    {
        t[0] = 99;
    }

    static void modifTailleSansRef(int[] t)
    {
        Array.Resize(ref t, 8);
    }

Ответ 8

Массивы всегда являются ссылочными типами. Не имеет значения, что массив будет содержать тип значения, такой как int или ссылочный тип, например string.Когда вы объявляете массив, например

int[] integers=new int[10];

integers variable содержит только ссылку на массив, который будет находиться в куче.

Также есть много упоминаний о том, что вы можете различать тип значения из ссылочного типа, просто зависит от того, какая переменная может быть нулевой или нет. Я хотел бы упомянуть, что в С# в настоящее время значения типов также могут быть null

например

int? integer=null

и это нехороший способ идентифицировать тип: ссылка или значение зависит только от переменной факта, которая может быть нулевой или нет.

Ответ 9

Я не понимаю; если это ссылочный тип, почему он передается по значению?

в этом примере вы можете видеть, что это значение тип..

    static void Main(string[] args)
    {
        int[] array10 = new int[10]{1,2,3,4,5,6,7,8,9,10};
        FuncConvert(array10);
        Console.WriteLine($"array10 {array10.Length}");// Print 10
    }

    private static void FuncConvert(int[] array10 )
    {
        int[] array5 = new int[5] {9,8,7,6,5};
        array10 = array5;

        Console.WriteLine($"array5 {array5.Length}");//Print 5
        Console.WriteLine($"array10 {array10.Length}");//Print 5
    }

Ответ 10

Немного проницательность:

Например, int представляет одно целое число, int[] представляет массив целых чисел.

Чтобы инициализировать массив с определенными размерами, вы можете использовать ключевое слово new, указав размер в квадратных скобках после имени типа:

//create a new array of 32 ints.
int[] integers = new int[32];

Все массивы являются ссылочными типами и следуют эталонной семантике. Следовательно, в этом коде, хотя отдельные элементы являются примитивными типами значений, массив integers является ссылочным типом. Поэтому, если вы позже напишите:

int[] copy = integers;

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

Синтаксис массива С# является гибким, он позволяет объявлять массивы, не инициализируя их, чтобы массив мог динамически определяться позже в программе. С помощью этой методики вы в основном создаете нулевую ссылку и позже указываете, что ссылка на динамически распределенную ячейку памяти, запрошенную ключевым словом new:

int[] integers;
integers = new int[32];

Спасибо.