В С# можно инициализировать массив без ключевого слова "новый", как в следующем примере:
int[] x = { 10, 20, 30 };
Означает ли это, что массив будет инициализирован в стеке, поскольку для инициализации чего-либо в куче необходимо ключевое слово "новое"?
Краткий ответ: Нет.
Код, который вы показываете, является сокращением для int[] x = new [] { 10, 20, 30 }
который является сокращением для int[] x = new int[] { 10, 20, 30}
который является сокращением для int[] x = new int[3]; x[0] = 10; x[1] = 20; x[2] = 30;
int[] x = new int[3]; x[0] = 10; x[1] = 20; x[2] = 30;
(см. MSDN)
Нет никакой разницы в реализации.
Единственный способ выделения массива в стеке - использовать небезопасный код с stackalloc
словом stackalloc
, как указано в комментариях. Пример из MSDN:
int* block = stackalloc int[100];
Я хотел бы добавить что-то еще здесь.
То, что у вас будет в стеке, это heapAddress вашего массива int. Скажем, когда вы передаете этот массив в некоторую функцию, то то, что вы проходите, является значением heapAddress из Stack.
Промежуточный код, который генерируется, тот же для новых и без новых инициализаций.
Образец кода:
public class Class1
{
int[] a = new int[4];
}
public class Class2
{
int[] a = { 1, 2, 3, 4 };
}
Составитель:
(Поскольку у меня нет необходимых точек для загрузки изображений, вы можете просмотреть его в ildasm)