ConditionalWeakTable<TKey,TValue> Třída

Definice

Umožňuje kompilátorům dynamicky připojovat pole objektů ke spravovaným objektům.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)

Parametry typu

TKey

Typ odkazu, ke kterému je pole připojeno.The reference type to which the field is attached.

TValue

Typ pole.The field's type. Musí se jednat o typ odkazu.This must be a reference type.

Dědičnost
ConditionalWeakTable<TKey,TValue>
Atributy

Příklady

Následující příklad ukazuje, že klíč uložený v ConditionalWeakTable<TKey,TValue> tabulce nezůstane po odkazech na něj mimo tabulku zničený.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. Příklad definuje dvě třídy: ManagedClass, které představují klíč v tabulce, a ClassData, který představuje hodnotu klíče.The example defines two classes: ManagedClass, which represents the key in the table, and ClassData, which represents the key's value. Příklad vytvoří instanci tří objektů každého typu.The example instantiates three objects of each type. Také vytvoří instanci WeakReference objektu, který představuje sekundu ManagedClass, a pak odstraní druhou ManagedClass instanci.It also instantiates a WeakReference object that represents the second ManagedClass, and then destroys the second ManagedClass instance. Pokus o načtení druhého ManagedClass objektu Target z vlastnosti označuje, že nezůstanou žádné odkazy na objekt.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.

Poznámky

ConditionalWeakTable<TKey,TValue> Třída umožňuje kompilátorům jazyka připojit libovolné vlastnosti ke spravovaným objektům v době běhu.The ConditionalWeakTable<TKey,TValue> class enables language compilers to attach arbitrary properties to managed objects at run time. ConditionalWeakTable<TKey,TValue> Objekt je slovník, který váže spravovaný objekt, který je reprezentován klíčem, na jeho připojenou vlastnost, která je reprezentovaná hodnotou.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. Klíče objektu jsou jednotlivé instance TKey třídy, ke které je vlastnost připojena, a její hodnoty jsou hodnoty vlastností, které jsou přiřazeny odpovídajícím objektům.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.

Klíče musí být jedinečné. Jinými slovy, ConditionalWeakTable<TKey,TValue> třída podporuje jednu připojenou hodnotu na spravovaný objekt.Keys must be unique; in other words, the ConditionalWeakTable<TKey,TValue> class supports one attached value per managed object. Dva klíče jsou stejné, pokud je předáte Object.ReferenceEquals do metody true, kterou vrátí.Two keys are equal if passing them to the Object.ReferenceEquals method returns true.

Poznámka

Porovnání rovnosti nelze řídit přepsáním Object.GetHashCode pro explicitní nastavení kódu hash pro klíč.You cannot control equality comparisons by overriding Object.GetHashCode to explicitly set the hash code for a key. Třída nepoužívá metodu k výpočtu kódů hash, a proto nevyvolává Object.GetHashCode přepsání. 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.

I když ConditionalWeakTable<TKey,TValue> Třída uchovává kolekci párů klíč/hodnota, je nejvhodnější jako tabulka namísto objektu 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> Třída se od slovníku liší v několika ohledech:The ConditionalWeakTable<TKey,TValue> class differs from a dictionary in several ways:

  • Neuchovává klíče.It does not persist keys. To znamená, že klíč není udržován pouze v případě, že je členem kolekce.That is, a key is not kept alive only because it is a member of the collection.

  • Nezahrnuje všechny metody (například GetEnumerator nebo Contains), které má slovník obvykle.It does not include all the methods (such as GetEnumerator or Contains) that a dictionary typically has.

  • Neimplementuje IDictionary<TKey,TValue> rozhraní.It does not implement the IDictionary<TKey,TValue> interface.

ConditionalWeakTable<TKey,TValue> Třída se od ostatních objektů kolekce liší v rámci správy životnosti klíčů uložených v kolekci.The ConditionalWeakTable<TKey,TValue> class differs from other collection objects in its management of the object lifetime of keys stored in the collection. Obvykle, pokud je objekt uložen v kolekci, jeho životnost trvá, dokud není odebrána (a neexistují žádné další odkazy na objekt) nebo dokud není zničen samotný objekt kolekce.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. Když ale ve ConditionalWeakTable<TKey,TValue> třídě přidáte dvojici klíč/hodnota do tabulky, nezajistíte tak, že klíč bude zachován, i když je možné ho získat přímo z hodnoty uložené v tabulce (například pokud tabulka obsahuje jeden klíč, a s hodnotou v1. a druhý klíč, B, s hodnotou P2, která obsahuje odkaz na hodnotu).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). Místo toho ConditionalWeakTable<TKey,TValue> automaticky odebere položku klíč/hodnota, jakmile se nevyskytuje žádný jiný odkaz na klíč mimo tabulku.Instead, ConditionalWeakTable<TKey,TValue> automatically removes the key/value entry as soon as no other references to a key exist outside the table. Příklad uvádí ukázku.The example provides an illustration.

Konstruktory

ConditionalWeakTable<TKey,TValue>()

Inicializuje novou instanci třídy ConditionalWeakTable<TKey,TValue> třídy.Initializes a new instance of the ConditionalWeakTable<TKey,TValue> class.

Metody

Add(TKey, TValue)

Přidá do tabulky klíč.Adds a key to the table.

AddOrUpdate(TKey, TValue)

Přidá klíč a hodnotu, pokud klíč neexistuje, nebo aktualizuje hodnotu existujícího klíče, pokud existuje.Adds the key and value if the key doesn't exist, or updates the existing key's value if it does exist.

Clear()

Vymaže všechny páry klíč/hodnota.Clears all the key/value pairs.

Equals(Object)

Určuje, zda se zadaný objekt rovná aktuálnímu objektu.Determines whether the specified object is equal to the current object.

(Zděděno od Object)
Finalize()

Zajišťuje, aby prostředky byly uvolněny a jiné operace čištění byly provedeny v případě, že systém uvolňování paměti ConditionalWeakTable<TKey,TValue> objekt znovu získá.Ensures that resources are freed and other cleanup operations are performed when the garbage collector reclaims the ConditionalWeakTable<TKey,TValue> object.

GetHashCode()

Slouží jako výchozí funkce hash.Serves as the default hash function.

(Zděděno od Object)
GetOrCreateValue(TKey)

Atomicky vyhledá zadaný klíč v tabulce a vrátí odpovídající hodnotu.Atomically searches for a specified key in the table and returns the corresponding value. Pokud klíč v tabulce neexistuje, vyvolá metoda konstruktor bez parametrů třídy, která představuje hodnotu tabulky, a vytvoří tak hodnotu, která je svázána se zadaným klíčem.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 Získá aktuální instanci.Gets the Type of the current instance.

(Zděděno od Object)
GetValue(TKey, ConditionalWeakTable<TKey,TValue>)

Atomicky vyhledá zadaný klíč v tabulce a vrátí odpovídající hodnotu.Atomically searches for a specified key in the table and returns the corresponding value. Pokud klíč v tabulce neexistuje, metoda vyvolá metodu zpětného volání pro vytvoření hodnoty, která je svázána se zadaným klíčem.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()

Vytvoří kopii aktuálního Objectseznamu.Creates a shallow copy of the current Object.

(Zděděno od Object)
Remove(TKey)

Odebere z tabulky klíč a jeho hodnotu.Removes a key and its value from the table.

ToString()

Vrací řetězec, který představuje aktuální objekt.Returns a string that represents the current object.

(Zděděno od Object)
TryGetValue(TKey, TValue)

Získá hodnotu zadaného klíče.Gets the value of the specified key.

Explicitní implementace rozhraní

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

Platí pro

Bezpečný přístup z více vláken

ConditionalWeakTable<TKey,TValue> Instance třídy jsou bezpečné pro přístup z více vláken.Instances of the ConditionalWeakTable<TKey,TValue> class are thread safe. Nevyžadují, aby volající mohli provádět žádné další zamykání.They do not require callers to do any additional locking.