ConditionalWeakTable<TKey,TValue>.GetOrCreateValue(TKey) Metodo

Definizione

Ricerca atomicamente una chiave specificata nella tabella e restituisce il valore corrispondente. Se la chiave non esiste nella tabella, il metodo richiama il costruttore senza parametri della classe che rappresenta il valore della tabella per creare un valore che viene associato alla chiave specificata.

public TValue GetOrCreateValue (TKey key);

Parametri

key
TKey

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

Restituisce

TValue

Valore che corrisponde a key, se key esiste già nella tabella. In caso contrario, nuovo valore creato dal costruttore senza parametri della classe definita dal parametro di tipo generico TValue.

Eccezioni

key è null.

La classe che rappresenta il valore della tabella non definisce un costruttore senza parametri.

Nota: nelle app .NET per Windows Store o nella libreria di classi portabile intercettare in alternativa l'eccezione della classe di base MissingMemberException.

Esempio

Nell'esempio seguente viene definita una MainClass classe e una MainInfo classe , che fornisce informazioni sull'istanza MainClass di . Nell'esempio viene chiamato il GetOrCreateValue metodo per aggiungere un MainClass oggetto e il relativo oggetto associato MainInfo a una ConditionalWeakTable<TKey,TValue> tabella. L'esempio illustra anche le chiamate ai Add metodi e GetValue 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, il metodo lo aggiunge, insieme all'oggetto di cui viene creata un'istanza chiamando il costruttore senza parametri della classe definita dal TValue parametro di tipo generico. Se la TValue classe non ha un costruttore senza parametri, viene generata un'eccezione MissingMethodException .

Si tratta del metodo consigliato per recuperare un valore esistente o aggiungere un nuovo valore alla ConditionalWeakTable<TKey,TValue> tabella se la classe del valore della tabella definisce un costruttore senza parametri. Se non definisce un costruttore senza parametri, è invece possibile chiamare il GetValue metodo , che si basa su un metodo fornito dal callback per creare un'istanza dell'oggetto che rappresenta il valore della tabella

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 .

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