ConditionalWeakTable<TKey,TValue>.GetOrCreateValue(TKey) Método

Definición

Busca de forma atómica una clave especificada en la tabla y devuelve el valor correspondiente. Si la clave no existe en la tabla, el método invoca el constructor sin parámetros de la clase que representa el valor de la tabla para crear un valor enlazado a la clave especificada.

C#
public TValue GetOrCreateValue(TKey key);

Parámetros

key
TKey

Clave que se va a buscar. key representa el objeto al que se adjunta la propiedad.

Devoluciones

TValue

El valor correspondiente a key, si key ya existe en la tabla; en caso contrario, un nuevo valor creado por el constructor sin parámetros de la clase definida por el parámetro de tipo genérico TValue.

Excepciones

key es null.

La clase que representa el valor de la tabla no define un constructor sin parámetros.

Nota: En las aplicaciones .NET para la Tienda Windows o la Biblioteca de clases portable, capture en su lugar la excepción de clase base, MissingMemberException.

Ejemplos

En el ejemplo siguiente se define una MainClass clase y una MainInfo clase , que proporciona información sobre la MainClass instancia de . En el ejemplo se llama al GetOrCreateValue método para agregar un MainClass objeto y su objeto adjunto MainInfo a una ConditionalWeakTable<TKey,TValue> tabla. En el ejemplo también se muestran las llamadas a los Add métodos y GetValue para agregar pares clave-valor a la tabla y al TryGetValue método para recuperar el valor de una clave existente.

C#
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

Comentarios

Si key no existe en la tabla, el método lo agrega, junto con el objeto al que se crea una instancia llamando al constructor sin parámetros de la clase definida por el TValue parámetro de tipo genérico. Si la TValue clase no tiene ningún constructor sin parámetros, se produce una MissingMethodException excepción .

Este es el método recomendado para recuperar un valor existente o agregar un nuevo valor a la ConditionalWeakTable<TKey,TValue> tabla si la clase del valor de la tabla define un constructor sin parámetros. Si no define un constructor sin parámetros, puede llamar al GetValue método , que se basa en un método proporcionado por devolución de llamada para crear instancias del objeto que representa el valor de la tabla.

Para recuperar el valor de una clave existente sin agregar el par clave-valor si la clave no se encuentra en la tabla, llame al TryGetValue método .

Se aplica a

Producto Versiones
.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, 10
.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

Consulte también