ConditionalWeakTable<TKey,TValue> Klasa

Definicja

Umożliwia kompilatorom dynamiczne dołączanie pól obiektów do zarządzanych obiektów.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 odwołania, do którego pole jest dołączone.The reference type to which the field is attached.

TValue

Typ pola.The field's type. Musi to być typ referencyjny.This must be a reference type.

Dziedziczenie
ConditionalWeakTable<TKey,TValue>
Atrybuty

Przykłady

Poniższy przykład ilustruje, że klucz przechowywany w tabeli ConditionalWeakTable<TKey,TValue> nie jest utrwalany po usunięciu odwołań do niego poza tabelą.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. W przykładzie zdefiniowano dwie klasy: ManagedClass, która reprezentuje klucz w tabeli, a ClassData, która reprezentuje wartość klucza.The example defines two classes: ManagedClass, which represents the key in the table, and ClassData, which represents the key's value. Przykład tworzy wystąpienie trzech obiektów każdego typu.The example instantiates three objects of each type. Tworzy również wystąpienie WeakReference obiektu, który reprezentuje drugi ManagedClass, a następnie niszczy drugie wystąpienie ManagedClass.It also instantiates a WeakReference object that represents the second ManagedClass, and then destroys the second ManagedClass instance. Próba pobrania drugiego obiektu ManagedClass z właściwości Target wskazuje, że żadne odwołanie do obiektu nie pozostało.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.

Uwagi

Klasa ConditionalWeakTable<TKey,TValue> umożliwia kompilatorom języka dołączanie dowolnych właściwości do obiektów zarządzanych w czasie wykonywania.The ConditionalWeakTable<TKey,TValue> class enables language compilers to attach arbitrary properties to managed objects at run time. Obiekt ConditionalWeakTable<TKey,TValue> jest słownikiem, który wiąże obiekt zarządzany, który jest reprezentowany przez klucz do dołączonej właściwości, która jest reprezentowana przez wartość.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. Klucze obiektu są pojedynczymi wystąpieniami klasy TKey, do której jest dołączona właściwość, a jej wartości są wartościami właściwości przypisanymi do odpowiednich obiektów.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.

Klucze muszą być unikatowe; Innymi słowy, Klasa ConditionalWeakTable<TKey,TValue> obsługuje jedną załączoną wartość na obiekt zarządzany.Keys must be unique; in other words, the ConditionalWeakTable<TKey,TValue> class supports one attached value per managed object. Dwa klucze są równe, jeśli przekazywanie ich do metody Object.ReferenceEquals zwraca true.Two keys are equal if passing them to the Object.ReferenceEquals method returns true.

Uwaga

Nie można kontrolować porównania równości poprzez zastępowanie Object.GetHashCode, aby jawnie ustawić skrót dla klucza.You cannot control equality comparisons by overriding Object.GetHashCode to explicitly set the hash code for a key. Klasa ConditionalWeakTable<TKey,TValue> nie używa metody Object.GetHashCode do obliczania kodów skrótów i w związku z tym nie wywołuje Object.GetHashCode zastąpień.The ConditionalWeakTable<TKey,TValue> class does not use the Object.GetHashCode method to compute hash codes, and therefore does not invoke Object.GetHashCode overrides.

Chociaż Klasa ConditionalWeakTable<TKey,TValue> przechowuje kolekcję par klucz/wartość, najlepiej jest traktować ją jako tabelę, a nie obiekt słownika.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. Klasa ConditionalWeakTable<TKey,TValue> różni się od słownika na kilka sposobów:The ConditionalWeakTable<TKey,TValue> class differs from a dictionary in several ways:

  • Klucze nie są utrwalane.It does not persist keys. Oznacza to, że klucz nie jest aktywny tylko, ponieważ jest elementem członkowskim kolekcji.That is, a key is not kept alive only because it is a member of the collection.

  • Nie zawiera on wszystkich metod (takich jak GetEnumerator lub Contains), które zwykle ma słownik.It does not include all the methods (such as GetEnumerator or Contains) that a dictionary typically has.

  • Nie implementuje interfejsu IDictionary<TKey,TValue>.It does not implement the IDictionary<TKey,TValue> interface.

Klasa ConditionalWeakTable<TKey,TValue> różni się od innych obiektów kolekcji w zarządzaniu okresem istnienia obiektu kluczy przechowywanych w kolekcji.The ConditionalWeakTable<TKey,TValue> class differs from other collection objects in its management of the object lifetime of keys stored in the collection. Zwykle gdy obiekt jest przechowywany w kolekcji, jego okres istnienia będzie trwać do momentu jego usunięcia (i nie ma dodatkowych odwołań do obiektu) lub do momentu zniszczenia samego obiektu kolekcji.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. Jednak w klasie ConditionalWeakTable<TKey,TValue> Dodawanie pary klucz/wartość do tabeli nie gwarantuje, że klucz będzie trwały, nawet jeśli można go uzyskać bezpośrednio z wartości przechowywanej w tabeli (na przykład jeśli tabela zawiera jeden klucz, A, o wartości V1 i drugi klucz, B, z wartością P2, która zawiera odwołanie do).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). Zamiast tego ConditionalWeakTable<TKey,TValue> automatycznie usuwa wpis klucz/wartość, gdy tylko nie istnieją żadne inne odwołania do klucza spoza tabeli.Instead, ConditionalWeakTable<TKey,TValue> automatically removes the key/value entry as soon as no other references to a key exist outside the table. Przykład stanowi ilustrację.The example provides an illustration.

Konstruktory

ConditionalWeakTable<TKey,TValue>()

Inicjuje nowe wystąpienie klasy ConditionalWeakTable<TKey,TValue> klasy.Initializes a new instance of the ConditionalWeakTable<TKey,TValue> class.

Metody

Add(TKey, TValue)

Dodaje klucz do tabeli.Adds a key to the table.

AddOrUpdate(TKey, TValue)

Dodaje klucz i wartość, jeśli klucz nie istnieje, lub aktualizuje wartość istniejącego klucza, jeśli istnieje.Adds the key and value if the key doesn't exist, or updates the existing key's value if it does exist.

Clear()

Czyści wszystkie pary klucz/wartość.Clears all the key/value pairs.

Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.Determines whether the specified object is equal to the current object.

(Odziedziczone po Object)
Finalize()

Zapewnia, że zasoby są zwolnione i inne operacje czyszczenia są wykonywane, gdy moduł zbierający elementy bezużyteczne odzyskuje ConditionalWeakTable<TKey,TValue> obiektu.Ensures that resources are freed and other cleanup operations are performed when the garbage collector reclaims the ConditionalWeakTable<TKey,TValue> object.

GetHashCode()

Służy jako domyślna funkcja skrótu.Serves as the default hash function.

(Odziedziczone po Object)
GetOrCreateValue(TKey)

Niepodzielnie wyszukuje określony klucz w tabeli i zwraca odpowiadającą wartość.Atomically searches for a specified key in the table and returns the corresponding value. Jeśli klucz nie istnieje w tabeli, metoda wywołuje Konstruktor bez parametrów klasy, która reprezentuje wartość tabeli, aby utworzyć wartość powiązaną z określonym kluczem.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()

Pobiera Type bieżącego wystąpienia.Gets the Type of the current instance.

(Odziedziczone po Object)
GetValue(TKey, ConditionalWeakTable<TKey,TValue>)

Niepodzielnie wyszukuje określony klucz w tabeli i zwraca odpowiadającą wartość.Atomically searches for a specified key in the table and returns the corresponding value. Jeśli klucz nie istnieje w tabeli, metoda wywołuje metodę wywołania zwrotnego w celu utworzenia wartości, która jest powiązana z określonym kluczem.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()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
Remove(TKey)

Usuwa klucz i jego wartość z tabeli.Removes a key and its value from the table.

ToString()

Zwraca ciąg, który reprezentuje bieżący obiekt.Returns a string that represents the current object.

(Odziedziczone po Object)
TryGetValue(TKey, TValue)

Pobiera wartość określonego klucza.Gets the value of the specified key.

Jawne implementacje interfejsu

IEnumerable.GetEnumerator()

Zwraca moduł wyliczający, który może być używany do iteracji w tabeli ConditionalWeakTable<TKey,TValue>.Returns an enumerator that can be used to iterate through the ConditionalWeakTable<TKey,TValue> table.

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

Zwraca moduł wyliczający, który może być używany do iteracji w tabeli ConditionalWeakTable<TKey,TValue>.Returns an enumerator that can be used to iterate through the ConditionalWeakTable<TKey,TValue> table.

Dotyczy

Bezpieczeństwo wątkowe

Wystąpienia klasy ConditionalWeakTable<TKey,TValue> są bezpieczne wątkowo.Instances of the ConditionalWeakTable<TKey,TValue> class are thread safe. Nie wymagają od wywołujących żadnych dodatkowych blokad.They do not require callers to do any additional locking.