C # - по классам и памяти - PullRequest
       18

C # - по классам и памяти

2 голосов
/ 24 января 2009

Я довольно новичок в C #, но я постараюсь попробовать , чтобы сделать это быстро! ;)

Это просто теоретическая ситуация, но представьте, что:

I) Один из них имеет класс «ClassA» с «ClassB» внутри и «ClassC» внутри «ClassB».

II) В ClassA есть метод, который вызывается. Сам метод (не знаю имени для этого) «создает» новый ClassB с уже существующей переменной classB. Следующим образом:

/*CLASS A*/
ClassA
{
    ClassB classB;

    ClassA()
    {
          classB = new ClassB();
    }

    MethodA()
    {
      classB = new ClassB();
    }
    // Other Methods...

}

/*CLASS B*/
ClassB
{
    ClassC classC;

    ClassB()
    {
        classC = new ClassC();
    }

    // Methods...

}

/*CLASS C*/
ClassC
{
  // Loads of variables being used...
}

Итак, я хочу знать:

a) Что будет с памятью в классе B? Будет ли такое же пространство в куче использоваться для класса или будет выделено новое пространство? Если последний случай, GC как-то освободит предыдущую память?

b) Каким будет результат вышеприведенного, что произойдет с classC, загруженным переменными, жующими память?

Буду весьма признателен за прямые ответы или простые ссылки на чтение. Я пытался найти ответ для себя, но, похоже, никто не объясняет такие абсурдные (?) Ситуации.

Прежде чем вы начнете рассуждать о происхождении этого вопроса, я вам уже скажу. Я действительно поставил себя в похожую ситуацию, которая примерно такова:

  • PrimaryClass
    • Sub-Class1
      • пара занятий
    • Sub-Class2
      • пара занятий

Так что это трехуровневое приложение иногда изменяется между подклассами 1 и 2, которые оба управляют «сценой». В этих «сценах» есть несколько классов, помогающих управлять вещами (как обычно). Это (по моим мыслям) невозможно найти.

Проблема в том, что и подкласс 1, и подкласс 2 могут потреблять немного памяти и используют некоторые «ресурсы». Поэтому я хотел бы стереть, да, вы слышали меня, стереть их из существования и затем заново создать их позже. Я немного прочитал, но не могу найти решение. (Как уже говорилось, я новичок в C # и все это .Net вещь управляемая). Любые предложения по этому вопросу, безусловно, будут оценены.

Хорошо, я написал немного больше, чем планировалось, но это все! С нетерпением ждем некоторого понимания этого! :)

С уважением, Роберт

Ответы [ 2 ]

5 голосов
/ 24 января 2009

Я немного перепишу:

ClassA()
{
  memberB = new ClassB();
}

MethodA()
{
  memberB = new ClassB();
}

В этом случае memberB содержит ссылку на экземпляр classB.

В конструкторе для classA создается новый экземпляр classB (назовите его instance 1), и ссылка на этот экземпляр присваивается memberB.

Когда вы вызываете methodA, создается другой экземпляр classB, и его ссылка присваивается memberB. memberB теперь указывает на instance 2. instance 1 больше не упоминается в коде, и GC очищает его, как только он вызывается.

Поэтому я хотел бы стереть, да, вы слышали меня, стереть их из существования, а затем воссоздать их снова.

Весь смысл C # в том, что вы не связываетесь с памятью. Конечно, вы можете позвонить GC.Collect() в любое время, когда захотите, но это не гарантирует освобождение всех ваших экземпляров, на которые нет ссылок (хотя, как показывает практика).

Если вы хотите точно контролировать свои ресурсы, реализуйте свои ресурсоемкие классы с помощью C ++ / CLI, наследуйте их от IDisposable и вызывайте их в рамках директивы using.

1 голос
/ 24 января 2009

Вот начальная настройка:

Instance of ClassA (original)
  Field refers to an instance of ClassB (original)
    Field refers to an instance of ClassC (original)

Метод A вызывается для исходного экземпляра ClassA. Вот изображение после

Instance of ClassA (original)
  Field refers to an instance of ClassB (new)
    Field refers to an instance of ClassC (new)

Instance of ClassB (original) - no references can reach
  refers to an instance of ClassC (original)

Поскольку никакие ссылки в вашей программе не могут достичь исходного ClassB и оригинального ClassC, сборщик мусора может собирать его бесплатно.

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