Инициализация массива без ключевого слова «новый»

1

В С# можно инициализировать массив без ключевого слова "новый", как в следующем примере:

int[] x = { 10, 20, 30 };

Означает ли это, что массив будет инициализирован в стеке, поскольку для инициализации чего-либо в куче необходимо ключевое слово "новое"?

  • 1
    Синтаксический сахар отличается от новой языковой конструкции. Это так же, как любой другой массив.
  • 0
    Возможно, вы ищете ключевое слово stackalloc msdn.microsoft.com/en-us/library/cx9s2sy4.aspx
Показать ещё 1 комментарий
Теги:
arrays
stack
heap

3 ответа

4
Лучший ответ

Краткий ответ: Нет.

Код, который вы показываете, является сокращением для 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];
0

Я хотел бы добавить что-то еще здесь.

То, что у вас будет в стеке, это heapAddress вашего массива int. Скажем, когда вы передаете этот массив в некоторую функцию, то то, что вы проходите, является значением heapAddress из Stack.

-3

Промежуточный код, который генерируется, тот же для новых и без новых инициализаций.

Образец кода:

 public class Class1
{
    int[] a = new int[4];
}

public class Class2
{
    int[] a = { 1, 2, 3, 4 };
}

Составитель:

(Поскольку у меня нет необходимых точек для загрузки изображений, вы можете просмотреть его в ildasm)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню