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 zum Anheften eines statischen Felds im Arbeitsspeicher. 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 Feldadresse. Vor und nach dem Instanziieren dieser beiden Objekte wird eine Reihe von Speicherzuweisungen vorgenommen, und der Garbage Collector wird aufgerufen. Die Ausgabe aus dem Beispiel zeigt, dass die Adresse des ersten Age Felds nach der Garbage Collection geändert wurde, die Adresse des Felds, auf das angewendet wird, FixedAddressValueTypeAttribute 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: