Когда оператор 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 байт.
Мой вопрос : что происходит во второй строке? Что делает оператор new ()
? Обнуляются ли только члены структуры Date
или также выделяется место в куче? С одной стороны, я бы не ожидал, что new
выделит место в куче, конечно, потому что в первой строке память уже выделена в стеке для экземпляра структуры. С другой стороны,
Может быть, это потому, что я пришел из C ++.
Тем не менее, если ответ: «когда new
используется с типами значений, он обнуляет только члены объекта», то это немного противоречивое значение оператора new
, потому что :
new
с типами значений обнуляет только элементы объекта в стеке new
со ссылочными типами он выделяет память в куче для экземпляра и исключения его участников Заранее спасибо,
Ура