Freigeben über


FixedAddressValueTypeAttribute Konstruktor

Definition

Initialisiert eine neue Instanz der FixedAddressValueTypeAttribute-Klasse.

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

Beispiele

Das folgende Beispiel veranschaulicht die Verwendung des FixedAddressValueTypeAttribute Attributs, um ein statisches Feld im Arbeitsspeicher anzuheften. Es definiert eine Age -Struktur und initialisiert zwei Klassen mit statischen Feldern vom Typ Age. Die zweite Klasse gilt für FixedAddressValueTypeAttribute das Anheften der Adresse des Felds. Eine Reihe von Speicherzuordnungen werden vor und nach dem Instanziieren dieser beiden Objekte vorgenommen und der Garbage Collector aufgerufen. Die Ausgabe des Beispiels zeigt, dass sich die Adresse des ersten Age Felds zwar nach der Garbage Collection geändert hat, die Adresse des Felds, auf das FixedAddressValueTypeAttribute angewendet wird, nicht.

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

Gilt für: