Я знаю, что int - это тип значения, но что такое массивы типов значений? Типы ссылок? Типы значений? Я хочу передать массив функции, чтобы что-то проверить. Должен ли я просто передать массив, поскольку он просто передаст ссылку, или я должен передать его как ref?
Является ли int [] ссылочным типом или типом значения?
Ответ 1
Массивы - это механизмы, которые позволяют вам рассматривать несколько предметов как одно коллекция. Общий раздел Microsoft®.NET Язык Runtime (CLR) поддерживает одномерные массивы, многомерные массивы и зубчатые массивы (массивы массивов). Все массивы типы неявно получены из System.Array, который сам выводится из System.Object. Это значит, что все массивы всегда являются ссылочными типамикоторые распределяются по управляемым куча, и ваша переменная app содержит ссылка на массив, а не массив.
Ответ 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];
Спасибо.