Извините, если эта проблема уже возникла: я просмотрел заданные вопросы и искал Google, но не видел никаких объяснений.C#: массив основных типов по сравнению с массивом классов
Я начал использовать C#, после почти 30 лет C, несколько месяцев Java и пару лет C++ 15 лет назад ... что может объяснить мое недоумение. В C#, если я хочу массив междунар, я могу сделать:
int[] a = new int[10];
На данный момент, я могу получить доступ к элементам массива
a[0] = 1; // This is OK
теперь у меня есть класс (скажем, SomeClass), и я хочу, чтобы создать массив из них:
SomeClass[] o = new SomeClass[10]
Я бы ожидать (для симметрии), что Я могу получить доступ к элементам массива, но
a[0].someField = val; // exception, must do a[0] = new SomeClass(); first
Итак, первый new[]
выделяет действительно только 10 указателей, а не 10 объектов, несмотря на синтаксис. Я должен повторить, что мои знания о C# не идеальны (:)), поэтому, пожалуйста, исправьте меня, если я ошибаюсь, но другая проблема с этим (помимо того, что, на мой взгляд, является путаницей между значениями и ссылками), является фрагментация памяти: с CI было бы выделено 10 «указателей» (malloc(10 * sizeof (void *));
, затем выделено всю область (malloc(10 * sizeof (SomeClass))
), затем использовались смещения для инициализации массива указателей, чтобы указать на область только malloc'd, сводя к минимуму фрагментацию памяти ... есть ли что-либо подобное ?. в C#
Вместо указателей, подумайте о ссылках на C++. Классы C# называются ссылочными типами по определенной причине. Вы можете иметь массив экземпляров класса так же, как вы можете иметь экземпляр 'std :: vector'. Вы должны добавить что-то там, прежде чем сможете получить к нему доступ. –
Если вы изменили его на «SomeStruct», но вы не можете получить массив «объектов», если они имеют ссылочный тип. – harold