Утилизировать экземпляр

Класс 1:

      public class FunctionBlocks
      { 
          List<Hashtable> _htLogicalNodeList;   
          public FunctionBlocks()
          { 
            _htLogicalNodeList = new List<Hashtable>();
            FunctionBlock fb = new FunctionBlock();
            fb.AddDODASignalList(new Hashtable);            
            _htLogicalNodeList.Add(fb.LogicalNodeHash);     
            fb = null;
          }     
      }

Класс 2:

      public class FunctionBlock
      {
        Hashtable _htLogicalNode;

        public FunctionBlock()
        {
            _htLogicalNode = new Hashtable();
        }

        public Hashtable LogicalNodeHash
        {
            get{return _htLogicalNode;}
            set{_htLogicalNode = value;}
        }

        public void AddDODASignalList(Hashtable doDASignal)
        {
            _htLogicalNode.Add(doDASignal);
        }
     }

В этом примере я не хочу распоряжаться "_htLogicalNode". Объект «fb» я сделал его нулевым, хотя экземпляр «FunctionBlocks» имеет ссылки «_htLogicalNode». Как я могу избавиться от экземпляра "_htLogicalNode".


person CRK    schedule 16.08.2011    source источник


Ответы (3)


Что вы имеете в виду под "распоряжаться"? Вы могли бы FunctionBlock реализовать IDisposable, и в этом случае вы могли бы используйте следующее:

using (FunctionBlock fb = new FunctionBlock())
{
    fb.AddDODASignalList(new Hashtable);            
    _htLogicalNodeList.Add(fb.LogicalNodeHash);     
}

Однако я не вижу ничего в FunctionBlock, что требует удаления, и поэтому делать это было бы бессмысленно - интерфейс/шаблон IDisposable, по сути, просто причудливый/надежный способ вызова метода, когда вы закончите с объектом. Если вы не сделаете что-то в реализованном методе Dispose, это ничего не сделает.

Если под «распоряжаться» вы имеете в виду освобождение памяти, то ответ таков: вам не нужно ничего делать (вам даже не нужно устанавливать fb в ноль). Просто позвольте fb выйти из области видимости, и сборщик мусора соберет его и освободит используемую память в свое время.

Вы можете обнаружить, что память, используемая fb, не освобождается сразу — это совершенно нормально и ожидаемо. Есть способы заставить сборщик мусора делать "свое дело", когда вы этого хотите, но это очень плохая практика.

person Justin    schedule 16.08.2011

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx#Y1583

См. статью выше.

person Cliffboss    schedule 16.08.2011

Переопределите метод dispose, и вы можете сделать его нулевым

person Zenwalker    schedule 16.08.2011