ConditionalWeakTable<TKey, TValue> Class

Microsoft Silverlight will reach end of support after October 2021. Learn more.

Updated: June 2010

Enables compilers to dynamically attach object fields to managed objects.

Inheritance Hierarchy

System.Object
  System.Runtime.CompilerServices.ConditionalWeakTable<TKey, TValue>

Namespace:  System.Runtime.CompilerServices
Assembly:  mscorlib (in mscorlib.dll)

Syntax

'Declaration
<ComVisibleAttribute(False)> _
Public NotInheritable Class ConditionalWeakTable(Of TKey As Class, TValue As Class)
[ComVisibleAttribute(false)]
public sealed class ConditionalWeakTable<TKey, TValue>
where TKey : class
where TValue : class

Type Parameters

  • TKey
    The reference type to which the field is attached.
  • TValue
    The field's type. This must be a reference type.

The ConditionalWeakTable<TKey, TValue> type exposes the following members.

Constructors

  Name Description
Public method ConditionalWeakTable<TKey, TValue> Initializes a new instance of the ConditionalWeakTable<TKey, TValue> class.

Top

Methods

  Name Description
Public method Add Adds a key to the table.
Public method Equals(Object) Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Protected method Finalize Allows an object to try to free resources and perform other cleanup operations before the Object is reclaimed by garbage collection. (Inherited from Object.)
Public method GetHashCode Serves as a hash function for a particular type. (Inherited from Object.)
Public method GetOrCreateValue 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 default constructor of the class that represents the table's value to create a value that is bound to the specified key.
Public method GetType Gets the Type of the current instance. (Inherited from Object.)
Public method GetValue 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.
Protected method MemberwiseClone Creates a shallow copy of the current Object. (Inherited from Object.)
Public method Remove Removes a key and its value from the table.
Public method ToString Returns a string that represents the current object. (Inherited from Object.)
Public method TryGetValue Gets the value of the specified key.

Top

Remarks

The ConditionalWeakTable<TKey, TValue> class enables language compilers to attach arbitrary properties to managed objects at run time. 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. 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.

Keys must be unique; in other words, the ConditionalWeakTable<TKey, TValue> class supports one attached value per managed object. Two keys are equal if passing them to the Object.ReferenceEquals method returns true.

NoteNote:

You cannot control equality comparisons by overriding Object.GetHashCode to explicitly set the hash code for a key. The ConditionalWeakTable<TKey, TValue> class does not use the Object.GetHashCode method to compute hash codes, and therefore does not invoke Object.GetHashCode overrides.

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. 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.

  • It does not include all the methods (such as GetEnumerator or Contains) that a dictionary typically has.

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

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. 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). 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.

Examples

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. The example defines two classes: ManagedClass, which represents the key in the table, and AttachedProperty, which represents the key's value. The example instantiates three objects of each type. It also instantiates a WeakReference object that represents the second ManagedClass, and then destroys the second ManagedClass instance. The attempt to retrieve the second ManagedClass object from the Target property indicates that no references to the object remain.

Imports System.Runtime.CompilerServices

Module Example
   Public Sub Demo(outputBlock As System.Windows.Controls.TextBlock)
      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
          outputBlock.Text += "No strong reference to mc2 exists."   
      Else If cwt.TryGetValue(mc2, data) Then
          outputBlock.Text += String.Format("Data created at {0}", data.CreationTime)      
      Else
          outputBlock.Text += "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.
using System;
using System.Runtime.CompilerServices;

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      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)
          outputBlock.Text += "No strong reference to mc2 exists.";   
      else if (cwt.TryGetValue(mc2, out data))
          outputBlock.Text += String.Format("Data created at {0}", data.CreationTime);      
      else
          outputBlock.Text += "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.

Version Information

Silverlight

Supported in: 5, 4

Platforms

For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.

Thread Safety

Instances of the ConditionalWeakTable<TKey, TValue> class are thread safe. They do not require callers to do any additional locking.

Change History

Date

History

Reason

June 2010

Replaced the example.

Customer feedback.