ConditionalWeakTable<TKey,TValue>.GetValue Metodo

Definizione

Ricerca atomicamente una chiave specificata nella tabella e restituisce il valore corrispondente. Se la chiave non esiste nella tabella, il metodo richiama un metodo di callback per creare un valore che viene associato alla chiave specificata.

public TValue GetValue (TKey key, System.Runtime.CompilerServices.ConditionalWeakTable<TKey,TValue>.CreateValueCallback createValueCallback);

Parametri

key
TKey

Chiave da ricercare. key rappresenta l'oggetto a cui è associata la proprietà.

createValueCallback
ConditionalWeakTable<TKey,TValue>.CreateValueCallback

Delegato a un metodo che può creare un valore per l'oggetto key specificato. Ha un singolo parametro di tipo TKeye restituisce un valore di tipo TValue.

Restituisce

TValue

Valore associato a key, se key esiste già nella tabella; in caso contrario, il nuovo valore restituito dal delegato createValueCallback.

Eccezioni

key o createValueCallback è null.

Esempio

Nell'esempio seguente viene definita una classe e una MainClassMainInfo classe, che fornisce informazioni sull'istanza MainClass . Definisce anche un metodo statico (Shared in Visual Basic) CreateAttachedValue che può essere assegnato al ConditionalWeakTable<TKey,TValue>.CreateValueCallback delegato e passato al GetValue metodo. Nell'esempio viene chiamato il metodo per aggiungere un MainClass oggetto e il GetValue relativo oggetto collegato MainInfo a una ConditionalWeakTable<TKey,TValue> tabella. L'esempio illustra anche le chiamate ai Add metodi e GetOrCreateValue per aggiungere coppie chiave/valore alla tabella e al TryGetValue metodo per recuperare il valore di una chiave esistente.

using System;
using System.Reflection;
using System.Runtime.CompilerServices;

public class Example
{
   string Name; 
   
   public Example(string name)
   {
      this.Name = name;
   }
   
   public override string ToString()
   {
      return this.Name;
   }
}

// Define a class to contain information about each Example instance.
public class ExampleInfo
{
   public string Name;
   public int Methods;
   public int Properties;
   
   public override string ToString()
   {
      return String.Format("{0}: {1} Methods, {2} Properties", 
                           this.Name, this.Methods, this.Properties);
   }
}

public class ExampleTest
{
   private static BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

   public static void Main()
   {
      Example ex1 = new Example("ex1");
      Example ex2 = new Example("ex2");
      Example ex3 = new Example("ex3");
      
      ExampleInfo exInfo1 = new ExampleInfo(); 
      exInfo1.Name = ex1.ToString();
      exInfo1.Methods = ex1.GetType().GetMethods(flags).Length;
      exInfo1.Properties = ex1.GetType().GetProperties(flags).Length;
      
      ExampleInfo exInfo3 = new ExampleInfo(); 
      exInfo3.Name = ex3.ToString();
      exInfo3.Methods = ex3.GetType().GetMethods(flags).Length;
      exInfo3.Properties = ex3.GetType().GetProperties(flags).Length;

      var attached = new ConditionalWeakTable<Example, ExampleInfo>();
      ExampleInfo value = null;

      // Attach a property to ex1 using the Add method, then retrieve it.
      attached.Add(ex1, exInfo1);
      if (attached.TryGetValue(ex1, out value))
         Console.WriteLine("{0}, {1}", ex1, value);
      else
         Console.WriteLine("{0} does not have an attached property.", ex1);

      // Attempt to retrieve the value attached to ex2.
      value = attached.GetValue(ex2, ExampleTest.CreateAttachedValue);      
      if (attached.TryGetValue(ex2, out value))
         Console.WriteLine("{0}, {1}", ex2, value);
      else 
         Console.WriteLine("{0} does not have an attached property.", ex2);
      
      // Attempt to retrieve the value attached to ex3.
      value = attached.GetOrCreateValue(ex3);
      Console.WriteLine("{0}, {1}", ex3, value);
   }

   public static ExampleInfo CreateAttachedValue(Example ex)
   {
      ExampleInfo info = new ExampleInfo();
      info.Name = ex.ToString();
      info.Methods = ex.GetType().GetMethods(flags).Length;
      info.Properties = ex.GetType().GetProperties(flags).Length;
      return info;
   }
}
// The example displays the following output:
//       ex1, ex1: 4 Methods, 0 Properties
//       ex2, ex2: 4 Methods, 0 Properties
//       ex3, : 0 Methods, 0 Properties

Commenti

Se key non esiste nella tabella, GetValue richiama il metodo definito dal createValueCallback parametro e lo passa. Un nuovo valore è associato alla chiave nella tabella e restituita di conseguenza.

Usare questo metodo solo quando la classe che rappresenta il valore della tabella non definisce un costruttore senza parametri. Se definisce un costruttore senza parametri, usare invece il GetOrCreateValue metodo . Per recuperare il valore di una chiave esistente senza aggiungere la coppia chiave/valore se la chiave non viene trovata nella tabella, chiamare il TryGetValue metodo .

Se più thread tentano di creare la stessa chiave, createValueCallback può essere richiamato più volte con la stessa chiave. Solo una di queste chiamate avrà esito positivo e il relativo valore restituito verrà aggiunto alla tabella. Quale thread riesce a creare il valore è indeterminato. Questa regola consente alla tabella di richiamare createValueCallback all'esterno del blocco della tabella interna per evitare deadlock.

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Vedi anche