C #: Какие типы данных требуют NEW для выделения памяти? - PullRequest
4 голосов
/ 11 ноября 2011

Я хочу лучше понять разницу между использованием 'new' для выделения памяти для переменных и случаями, когда new не требуется.

Когда я заявляю

int i; // I don't need to use new.

Но

List<string> l = new List<string>();

Имеет ли смысл говорить "new int ()"?

Ответы [ 7 ]

6 голосов
/ 11 ноября 2011

Вам потребуется использовать new для выделения любого ссылочного типа (класса).

Любой тип значения (например, int или struct) может быть объявлен без нового.Тем не менее, вы все еще можете использовать новый.Допустимо следующее:

int i = new int();

Обратите внимание, что вы не можете напрямую получить доступ к типу значения, пока он не будет инициализирован.При использовании структуры использование new TheStructType() часто ценно, поскольку позволяет полностью использовать члены структуры без предварительной явной инициализации каждого члена.Это потому, что конструктор выполняет инициализацию.С типом значения конструктор по умолчанию всегда инициализирует все значения эквивалентными 0.

Кроме того, со структурой вы можете использовать new с конструктором не по умолчанию, таким как:

MyStruct val = new MyStruct(32, 42);

Это обеспечивает способ инициализации значений внутри структуры.Это, как говорится, здесь не требуется, только опция.

3 голосов
/ 11 ноября 2011

Вам не нужны новые типы значений в c #.Все остальные типы вы делаете.

3 голосов
/ 11 ноября 2011

Любой ссылочный тип (например, классы) потребует нового. Типы значений (например, int) являются простыми значениями и не требуют новых.

2 голосов
/ 11 ноября 2011

Ознакомьтесь с этой документацией MSDN по new

Он также используется для вызова конструктора по умолчанию для типов значений, например:

int myInt = new int ();

В предыдущем выражении myInt инициализируется значением 0, что является значением по умолчанию для типа int.Оператор имеет тот же эффект, что и:

int myInt = 0;

1 голос
/ 12 ноября 2011

Просто проверьте IL: вы можете видеть, что компилятор испускает 'initobj' или 'newobj'.

initobj испускается для обоих int i = 0; и int i = new int ();

http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.initobj(v=vs.85).aspx

1 голос
/ 11 ноября 2011

Типы ссылок должны быть выделены с использованием new.

Типы значений не должны быть распределены в куче.Типы Integer, Double и struct являются примерами типов значений.Тип значения, который является локальной переменной, будет сохранен в стеке вызовов функций.Тип значения, являющийся полем класса, будет сохранен в данных экземпляра класса.

1 голос
/ 11 ноября 2011

int i - это тип значения , поэтому вам не нужно инициализировать, а new List<string>() - это ссылочный тип , вам нужно присвоить ему экземпляр объекта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...