Правильный способ хранения метаданных, связанных с объектом? - PullRequest
0 голосов
/ 21 ноября 2018

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

Обратите внимание, что у этого объекта нет GUID, который помогает идентифицировать себя, единственный способ идентифицировать его - это его экземпляр.Этот вид хранения очень похож на то, что в DependencyObject в WPF.Мы можем объявить DependencyProperty (прикрепленное свойство) для расширения DependencyObject (метаданные содержатся во вложенном свойстве).

Вот что у меня есть:

Dictionary<object, SomeMetaData> _metadataLookup = new Dictionary<object,SomeMetaData>();
//to store metadata
_metadataLookup[someObject] = someMetaData;
//to get metadata
SomeMetaData someMetaData;
_metadataLookup.TryGetValue(someObject, out someMetaData);

Было быбудет хорошо, если время жизни someObject совпадает с временем жизни области с использованием _metadataLookup.Но что, если someObject (после сохранения в _metadataLookup) должен быть уничтожен (логически неиспользованным)?Мы также должны вручную удалить его из _metadataLookup, в противном случае происходит утечка памяти.

Я ищу лучшее решение для этой проблемы, неожиданно забывая удалить объекты вручную или просто не знаякогда объекты должны быть удалены, проблема здесь.Благодаря.

1 Ответ

0 голосов
/ 21 ноября 2018

Для этой цели вы можете использовать ConditionalWeakTable

public class Example
{
   public static void Main()
   {
      var mc1 = new ManagedClass();
      var mc2 = new ManagedClass();
      var mc3 = new ManagedClass();

      var cwt = new ConditionalWeakTable<ManagedClass, ClassData>();
      cwt.Add(mc1, new ClassData());          
      cwt.Add(mc2, new ClassData());
      cwt.Add(mc3, new ClassData());

      var wr2 = new WeakReference(mc2);
      mc2 = null;

      GC.Collect();

      ClassData data = null; 

      if (wr2.Target == null)
          Console.WriteLine("No strong reference to mc2 exists.");   
      else if (cwt.TryGetValue(mc2, out data))
          Console.WriteLine("Data created at {0}", data.CreationTime);      
      else
          Console.WriteLine("mc2 not found in the table.");
   }
}

public class ManagedClass
{ 
}

public class ClassData
{
   public DateTime CreationTime;
   public object Data;   

   public ClassData()
   {
      CreationTime = DateTime.Now;
      this.Data  = new object();     
   }
}
// The example displays the following output:
//       No strong reference to mc2 exists.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...