нули памяти.
operator new()
используется со ссылочным типом, пространство для экземпляра размещается в куче, а сама ссылочная переменная помещается в стек. Кроме того, все в экземпляре ссылочного типа, который размещен в куче, обнуляется.
Например вот класс:
class Person
{
public int id;
public string name;
}
В следующем коде:
class PersonDemo
{
static void Main()
{
Person p = new Person();
Console.WriteLine("id: {0} name: {1}", p.id, p.name);
}
}
p
переменная находится в стеке, и созданный экземплярPerson
(все его члены) в куче.p.id
было бы0
а такжеp.name
было быnull
, Это будет иметь место, потому что все, выделенное в куче, обнуляется.
Теперь, что я запутался, если я использую тип значения сnew
оператор. Например, примите во внимание следующую структуру:
struct Date
{
public int year;
public int month;
public int day;
}
class DateDemo
{
static void Main()
{
Date someDate;
someDate= new Date();
Console.WriteLine("someDate is: {0}/{1}/{2}",
someDate.month, someDate.day, someDate.year);
}
}
Теперь я хотел бы знать, что делают следующие строки из main:
Date someDate;
someDate= new Date();
В первой строкеsomeDate
переменная размещается в стеке. Точно 12 байтов.
Мой вопрос что происходит на второй строке? Что значитoperator new()
делать? Это только обнуление членовDate
структура или она также выделяет место в куче? С одной стороны, я бы не ожидалnew
выделять место в куче, конечно, потому что в первой строке память уже выделена в стеке для экземпляра структуры. С другой стороны, я бы ожидалnew
выделить место в куче и адрес возврата этого пространства, потому что это то, чтоnew
следует сделать. Может быть, это потому, что я пришел из C ++ фона.
Тем не менее, если ответ: «когдаnew
используется с типами значений, это только обнуляет члены объекта ", чем это немного противоречивое значениеnew
оператор потому что:
new
с типами значений, он только обнуляет члены объекта в стекекогда используешьnew
со ссылочными типами, он выделяет память в куче для экземпляра и очищает его элементыЗаранее спасибо,
ура