FixedAddressValueTypeAttribute Construtor

Definição

Inicializa uma nova instância da classe FixedAddressValueTypeAttribute.Initializes a new instance of the FixedAddressValueTypeAttribute class.

public:
 FixedAddressValueTypeAttribute();
public FixedAddressValueTypeAttribute ();
Public Sub New ()

Exemplos

O exemplo a seguir ilustra o uso do FixedAddressValueTypeAttribute atributo para fixar um campo estático na memória.The following example illustrates the use of the FixedAddressValueTypeAttribute attribute to pin a static field in memory. Ele define uma Age estrutura e inicializa duas classes que têm campos estáticos do tipo Age .It defines an Age structure and initializes two classes that have static fields of type Age. A segunda classe se aplica FixedAddressValueTypeAttribute para fixar o endereço do campo.The second class applies FixedAddressValueTypeAttribute to pin the field's address. Várias alocações de memória são feitas antes e depois que esses dois objetos são instanciados e o coletor de lixo é invocado.A number of memory allocations are made before and after these two objects are instantiated and the garbage collector is invoked. A saída do exemplo mostra que, embora o endereço do primeiro Age campo tenha sido alterado após a coleta de lixo, o endereço do campo ao qual FixedAddressValueTypeAttribute é aplicado não.The output from the example shows that although the address of the first Age field has changed after garbage collection, the address of the field to which FixedAddressValueTypeAttribute is applied has not.

using System;
using System.Runtime.CompilerServices;

public struct Age {
   public int years;
   public int months;
}

public class FreeClass
{
   public static Age FreeAge;
   
   public static unsafe IntPtr AddressOfFreeAge()
   { 
      fixed (Age* pointer = &FreeAge) 
      { return (IntPtr) pointer; } 
   }
}

public class FixedClass
{
   [FixedAddressValueType]
   public static Age FixedAge;
   
   public static unsafe IntPtr AddressOfFixedAge()
   { 
      fixed (Age* pointer = &FixedAge) 
      { return (IntPtr) pointer; } 
   }   
}

public class Example
{
   public static void Main()
   {
      AllocateMemory();
      
      // Get addresses of static Age fields.
      IntPtr freePtr1 = FreeClass.AddressOfFreeAge();
      AllocateMemory();
      
      IntPtr fixedPtr1 = FixedClass.AddressOfFixedAge();
      AllocateMemory();

      // Garbage collection.
      GC.Collect();
      GC.WaitForPendingFinalizers();
      
      // Get addresses of static Age fields after garbage collection.
      IntPtr freePtr2 = FreeClass.AddressOfFreeAge();
      IntPtr fixedPtr2 = FixedClass.AddressOfFixedAge();
        
      // Display addresses before and after garbage collection
      Console.WriteLine("Normal static: {0} -> {1}", freePtr1, freePtr2);
      Console.WriteLine("Pinned static:  {0} -> {1}", fixedPtr1, fixedPtr2);  
   }

   // Allocate memory for 100,000 objects.
   static public void AllocateMemory()
   {
      for (int ctr = 0; ctr <= 100000; ctr++)
      {
         object o = new object();      
      }
   }
}
// The example displays output similar to the following:
//       Normal static: 19932420 -> 19863704
//       Pinned static:  19985508 -> 19985508

Aplica-se a