Дилемма с использованием типов значений с оператором `new` в C #

Когда оператор 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 , потому что :

  1. при использовании new с типами значений обнуляет только элементы объекта в стеке
  2. , при использовании new со ссылочными типами он выделяет память в куче для экземпляра и исключения его участников

Заранее спасибо,
Ура

10
задан dragan.stepanovic 6 April 2011 в 08:53
поделиться