Что именно new [] делает в классе против структуры?

MyClass[] CLASS = new MyClass[5];
int[] STRUCT = new int[5];

Что именно new [] делает для класса против структуры. Очевидно, структура имеет некоторый перегруженный статический индекс, который заставляет ее запускать конструктор по умолчанию структуры. Однако новый [] для класса, похоже, ничего не делает, кроме как создает пространство для инициализации экземпляра класса. Как перегрузить статическое поведение класса, чтобы также запустить конструктор по умолчанию. Я знаю, как использовать для циклов и других методов достижения этой цели. Мой вопрос очень специфичен для того, что происходит под новым []. Я понимаю, что структура нуждается в значении по умолчанию. Но разве классу, не обнуляемому, также не нужно значение по умолчанию, поэтому он выдает ошибку, когда вы пытаетесь его использовать? Или это говорит мне, что все классы на самом деле обнуляются?

1 ответ

Решение

Нет, конструктор по умолчанию struct не работает Вместо этого происходит то, что в struct В этом случае память инициализируется на ноль. Что это означает, зависит от типа данных. Например, поле ссылки (например, класс или строка) становится null, числовые поля становятся 0, логические поля становятся false, так далее.

Это очень сильно отличается от того, как работают классы. Вот почему с инициализацией class массив, вы видите null ценности. В основном все сводится к этому. "Пустой" class переменная (или массив в вашем случае) становится null, Тем не менее, когда у вас есть "пустой" struct, у вас уже есть что-то действительное. Однако он инициализируется как пустой.

Самый простой способ увидеть это, когда у вас есть, например, int поле в классе. Это работает в основном так же. Когда вы добавляете int поле для класса, вы не обязаны его инициализировать. Когда вы не инициализируете его, он получает значение 0 по умолчанию. structработает так же в этом отношении.

См. http://msdn.microsoft.com/en-us/library/aa664471.aspx для получения дополнительной информации.

Еще несколько вещей для заметки (ответ на вопрос в комментариях):

  • Классы всегда обнуляются. Это означает, что единственный способ инициализировать массив - создать цикл и инициализировать новый экземпляр для каждого элемента в массиве;
  • Конструктор по умолчанию не применяется к структурам, потому что им не разрешено иметь конструктор по умолчанию. Если вы попытаетесь скомпилировать следующий фрагмент кода, вы получите сообщение об ошибке компиляции:

    struct MyStruct
    {
        public MyStruct()
        {
        }
    }
    
Другие вопросы по тегам