FixedAddressValueTypeAttribute Oluşturucu
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
FixedAddressValueTypeAttribute sınıfının yeni bir örneğini başlatır.
public:
FixedAddressValueTypeAttribute();
public FixedAddressValueTypeAttribute ();
Public Sub New ()
Örnekler
Aşağıdaki örnekte, statik bir alanı belleğe sabitlemek için özniteliğinin FixedAddressValueTypeAttribute kullanımı gösterilmektedir. Bir Age
yapı tanımlar ve türünde Age
statik alanlara sahip iki sınıf başlatır. İkinci sınıf, alanın adresini sabitlemek için geçerlidir FixedAddressValueTypeAttribute . Bu iki nesnenin örneği oluşturulur ve çöp toplayıcı çağrılır önce ve sonra bir dizi bellek ayırması yapılır. Örnekten elde edilen çıktı, atık toplama sonrasında ilk Age
alanın adresi değişmesine rağmen, uygulanan alanın FixedAddressValueTypeAttribute adresinin değişmediğini gösterir.
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