ConditionalWeakTable<TKey,TValue> Класс

Определение

Позволяет компиляторам динамически прикреплять поля к управляемым объектам.Enables compilers to dynamically attach object fields to managed objects.

generic <typename TKey, typename TValue>
 where TKey : class where TValue : classpublic ref class ConditionalWeakTable sealed
[System.Runtime.InteropServices.ComVisible(false)]
public sealed class ConditionalWeakTable<TKey,TValue> where TKey : class where TValue : class
type ConditionalWeakTable<'Key, 'Value (requires 'Key : null and 'Value : null)> = class
Public NotInheritable Class ConditionalWeakTable(Of TKey, TValue)

Параметры типа

TKey

Ссылочный тип, к которому прикрепляется поле.The reference type to which the field is attached.

TValue

Тип поля.The field's type. Это должен быть ссылочный тип.This must be a reference type.

Наследование
ConditionalWeakTable<TKey,TValue>
Атрибуты

Примеры

В следующем примере показано, что ключ, хранящийся ConditionalWeakTable<TKey,TValue> в таблице, не сохраняется после уничтожения ссылок на него за пределами таблицы.The following example illustrates that a key stored in the ConditionalWeakTable<TKey,TValue> table does not persist after references to it outside the table are destroyed. В примере определяются два класса ManagedClass:, который представляет ключ в таблице, и ClassData, представляющий значение ключа.The example defines two classes: ManagedClass, which represents the key in the table, and ClassData, which represents the key's value. В примере создаются экземпляры трех объектов каждого типа.The example instantiates three objects of each type. Он также создает экземпляр WeakReference объекта, который представляет второй ManagedClassобъект, а затем уничтожает второй ManagedClass экземпляр.It also instantiates a WeakReference object that represents the second ManagedClass, and then destroys the second ManagedClass instance. Попытка получить второй ManagedClass объект Target из свойства означает, что ссылки на объект не сохраняются.The attempt to retrieve the second ManagedClass object from the Target property indicates that no references to the object remain.

using System;
using System.Runtime.CompilerServices;

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(wr2.Target, 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.
Imports System.Runtime.CompilerServices

Module Example
   Public Sub Main()
      Dim mc1 As New ManagedClass()
      Dim mc2 As New ManagedClass()
      Dim mc3 As New ManagedClass()
                    
      Dim cwt As New ConditionalWeakTable(Of ManagedClass, ClassData)()
      cwt.Add(mc1, New ClassData())          
      cwt.Add(mc2, New ClassData())
      cwt.Add(mc3, New ClassData())
      
      Dim wr2 As New WeakReference(mc2)
      mc2 = Nothing

      GC.Collect()

      Dim data As ClassData = Nothing

      If wr2.Target Is Nothing Then
          Console.WriteLine("No strong reference to mc2 exists.")   
      Else If cwt.TryGetValue(mc2, data) Then
          Console.WriteLine("Data created at {0}", data.CreationTime)      
      Else
          Console.WriteLine("mc2 not found in the table.")
      End If
   End Sub
End Module

Public Class ManagedClass
End Class

Public Class ClassData
   Public CreationTime As DateTime
   Public Data As Object   
   
   Public Sub New()
      Me.CreationTime = DateTime.Now
      Me.Data  = New Object()     
   End Sub
End Class
' The example displays the following output:
'       No strong reference to mc2 exists.

Комментарии

ConditionalWeakTable<TKey,TValue> Класс позволяет компиляторам языков прикреплять произвольные свойства к управляемым объектам во время выполнения.The ConditionalWeakTable<TKey,TValue> class enables language compilers to attach arbitrary properties to managed objects at run time. ConditionalWeakTable<TKey,TValue> Объект — это словарь, который привязывает управляемый объект, представленный ключом, к присоединенному свойству, представленному значением.A ConditionalWeakTable<TKey,TValue> object is a dictionary that binds a managed object, which is represented by a key, to its attached property, which is represented by a value. Ключи объекта — это отдельные экземпляры TKey класса, к которому прикрепляется свойство, а его значения — это значения свойств, которые присваиваются соответствующим объектам.The object's keys are the individual instances of the TKey class to which the property is attached, and its values are the property values that are assigned to the corresponding objects.

Ключи должны быть уникальными; Иными словами, ConditionalWeakTable<TKey,TValue> класс поддерживает одно присоединенное значение для каждого управляемого объекта.Keys must be unique; in other words, the ConditionalWeakTable<TKey,TValue> class supports one attached value per managed object. Два ключа равны, если передать их в Object.ReferenceEquals метод возвращает. trueTwo keys are equal if passing them to the Object.ReferenceEquals method returns true.

Примечание

Вы не можете управлять сравнением на равенство Object.GetHashCode путем переопределения, чтобы явно задать хэш-код для ключа.You cannot control equality comparisons by overriding Object.GetHashCode to explicitly set the hash code for a key. Класс не использует метод для вычисления хэш-кодов и, следовательно, не вызывает Object.GetHashCode переопределения. Object.GetHashCode ConditionalWeakTable<TKey,TValue>The ConditionalWeakTable<TKey,TValue> class does not use the Object.GetHashCode method to compute hash codes, and therefore does not invoke Object.GetHashCode overrides.

Несмотря на ConditionalWeakTable<TKey,TValue> то, что класс содержит коллекцию пар «ключ-значение», ее лучше всего рассматривать как таблицу, а не как объект Dictionary.Although the ConditionalWeakTable<TKey,TValue> class holds a collection of key/value pairs, it is best thought of as a table rather than a dictionary object. ConditionalWeakTable<TKey,TValue> Класс отличается от словаря несколькими способами:The ConditionalWeakTable<TKey,TValue> class differs from a dictionary in several ways:

  • Он не сохраняет ключи.It does not persist keys. Это значит, что ключ не поддерживается только в том случае, если он является членом коллекции.That is, a key is not kept alive only because it is a member of the collection.

  • Он не включает все методы (такие как GetEnumerator или Contains), которые обычно имеют словарь.It does not include all the methods (such as GetEnumerator or Contains) that a dictionary typically has.

  • Он не реализует IDictionary<TKey,TValue> интерфейс.It does not implement the IDictionary<TKey,TValue> interface.

ConditionalWeakTable<TKey,TValue> Класс отличается от других объектов коллекции в управлении временем существования ключей, хранящихся в коллекции.The ConditionalWeakTable<TKey,TValue> class differs from other collection objects in its management of the object lifetime of keys stored in the collection. Обычно, когда объект хранится в коллекции, его время существования продолжается до тех пор, пока не будет удалено (и отсутствуют дополнительные ссылки на объект) или пока не будет уничтожен сам объект коллекции.Ordinarily, when an object is stored in a collection, its lifetime lasts until it is removed (and there are no additional references to the object) or until the collection object itself is destroyed. Однако в ConditionalWeakTable<TKey,TValue> классе добавление пары «ключ-значение» в таблицу не гарантирует, что ключ будет сохранен, даже если он может быть достигнут непосредственно из значения, хранящегося в таблице (например, если таблица содержит один ключ, а со значением V1). и второй ключ, B, со значением P2, содержащим ссылку на.However, in the ConditionalWeakTable<TKey,TValue> class, adding a key/value pair to the table does not ensure that the key will persist, even if it can be reached directly from a value stored in the table (for example, if the table contains one key, A, with a value V1, and a second key, B, with a value P2 that contains a reference to A). Вместо этого ConditionalWeakTable<TKey,TValue> автоматически удаляет запись «ключ-значение», как только не существует других ссылок на ключ за пределами таблицы.Instead, ConditionalWeakTable<TKey,TValue> automatically removes the key/value entry as soon as no other references to a key exist outside the table. Иллюстрация приведена в примере.The example provides an illustration.

Конструкторы

ConditionalWeakTable<TKey,TValue>()

Инициализирует новый экземпляр класса ConditionalWeakTable<TKey,TValue>.Initializes a new instance of the ConditionalWeakTable<TKey,TValue> class.

Методы

Add(TKey, TValue)

Добавляет ключ в таблицу.Adds a key to the table.

AddOrUpdate(TKey, TValue)

Добавляет ключ и значение, если этот ключ не существует, или обновляет значение существующего ключа.Adds the key and value if the key doesn't exist, or updates the existing key's value if it does exist.

Clear()

Очищает все пары "ключ — значение".Clears all the key/value pairs.

Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
Finalize()

Обеспечивает освобождение ресурсов и выполнение других завершающих операций, когда сборщик мусора восстанавливает объект ConditionalWeakTable<TKey,TValue>.Ensures that resources are freed and other cleanup operations are performed when the garbage collector reclaims the ConditionalWeakTable<TKey,TValue> object.

GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetOrCreateValue(TKey)

Единым блоком выполняет поиск указанного ключа в таблице и возвращает соответствующее значение.Atomically searches for a specified key in the table and returns the corresponding value. Если ключ в таблице не существует, метод вызывает конструктор класса без параметров, представляющего значение таблицы для создания значения, связанного с заданным ключом.If the key does not exist in the table, the method invokes the parameterless constructor of the class that represents the table's value to create a value that is bound to the specified key.

GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
GetValue(TKey, ConditionalWeakTable<TKey,TValue>)

Единым блоком выполняет поиск указанного ключа в таблице и возвращает соответствующее значение.Atomically searches for a specified key in the table and returns the corresponding value. Если ключ в таблице не существует, метод вызывает метод обратного вызова для создания значения, связанного с заданным ключом.If the key does not exist in the table, the method invokes a callback method to create a value that is bound to the specified key.

MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
Remove(TKey)

Удаляет ключ и его значение из таблицы.Removes a key and its value from the table.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)
TryGetValue(TKey, TValue)

Получает значение заданного ключа.Gets the value of the specified key.

Явные реализации интерфейса

IEnumerable.GetEnumerator()
IEnumerable<KeyValuePair<TKey,TValue>>.GetEnumerator()

Применяется к

Потокобезопасность

ConditionalWeakTable<TKey,TValue> Экземпляры класса являются потокобезопасными.Instances of the ConditionalWeakTable<TKey,TValue> class are thread safe. Они не нуждаются в вызывающих методах для дополнительной блокировки.They do not require callers to do any additional locking.