FixedAddressValueTypeAttribute Konstruktor
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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