2009-11-18 3 views
1

Привет У меня есть некоторые сомнения в распределении памяти ссылочных типов. Пожалуйста, уточните мои вопросы, которые комментируются между приведенным ниже кодом.Как память выделяется для ссылочных типов в C#?

class Program 
    { 
     static void Main(string[] args) 
     { 
      testclass objtestclass1 = new testclass(); 
      testclass objtestclass2 = new testclass(); 
      testclass objtestclass3 = new testclass(); 
      // Is seperate memory created for all the three objects that are created above ? 
      objtestclass1.setnumber(1); 
      objtestclass2.setnumber(2); 
      Console.Write(objtestclass1.number); 
      Console.Write(objtestclass2.number); 
      objtestclass3 = objtestclass1; 
      //When we assign one object to another object is the existing memory of  the   objtestclass3 be cleared by GC 
      Console.Write(objtestclass3.number); 
      objtestclass3.setnumber(3); 
      Console.Write(objtestclass3.number); 
      Console.Write(objtestclass1.number); 
      Console.Read(); 
      } 

      public class testclass 
      { 
       public int number = 0; 
       public void setnumber(int a) 
       { 
        number = a; 
       } 

      } 

Спасибо.

ответ

6

Экземпляр testclass находится на куче. Каждый экземпляр будет состоять из:

  • Блок синхронизации
  • Тип опорного
  • Поле number

На 32-битной Windows .NET, это займет 12 байт.

В местные переменные внутри Main метода (objtestclass1 и т.д.) будет в стеке - но они ссылки, а не объекты. Каждая ссылка будет 4 байта (опять же на 32-битной CLR).

Важное значение имеет разница между ссылками и объектами. Например, после этой строки:

objtestclass3 = objtestclass1; 

Вы делаете значения двух переменных то же самое - но эти значения являются ссылки. Другими словами, обе переменные относятся к тому же объекту, поэтому, если вы внесете изменения через одну переменную, вы сможете увидеть ее через другую переменную. Вы можете рассматривать ссылку как немного как URL-адрес - если у нас есть одинаковый URL-адрес, и один из нас редактирует страницу, на которую он ссылается, мы оба увидим это редактирование.

Для получения дополнительной информации об этом см. my article on reference types и еще один на memory.

+1

Привет, Jon, спасибо за ваш ответ. Я с гордостью могу сказать, что я ваш фанат :) – Jebli

2

Создана отдельная память для всех трех объектов, которые созданы выше?

Да.

Когда мы назначаем одного объекта к другому объекта является существующая память
objtestclass3 быть очищены ГХ

Не совсем. Во-первых, вы не назначаете один объект другому. Вы переназначаете переменную, содержащую ссылку на память в куче. Во-вторых, когда память на куче уже не имеет никаких переменных, относящихся к ней, GC обнаружит этот факт и вернет память, но никогда не «очищается».

+0

objtestclass3 = objtestclass1; В этом случае objtestclass3 указывает на то же «местоположение», на которое ссылается objtestclass1. Любое изменение переменных будет отражать как объекты objtestclass3, так и objtestclass1. – PRR

+0

Да. Переменные содержат ссылки на память, а не сами объекты. – RickNZ

+0

Да, +1 для вашего четкого ответа. – PRR

Смежные вопросы