FixedAddressValueTypeAttribute Klasa

Definicja

Naprawia adres pola statycznego typu wartości w całym okresie istnienia.Fixes the address of a static value type field throughout its lifetime. Klasa ta nie może być dziedziczona.This class cannot be inherited.

public ref class FixedAddressValueTypeAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Field)]
[System.Serializable]
public sealed class FixedAddressValueTypeAttribute : Attribute
type FixedAddressValueTypeAttribute = class
    inherit Attribute
Public NotInheritable Class FixedAddressValueTypeAttribute
Inherits Attribute
Dziedziczenie
FixedAddressValueTypeAttribute
Atrybuty

Przykłady

Poniższy przykład ilustruje użycie atrybutu FixedAddressValueTypeAttribute, aby przypiąć pole statyczne w pamięci.The following example illustrates the use of the FixedAddressValueTypeAttribute attribute to pin a static field in memory. Definiuje strukturę Age i inicjuje dwie klasy, które mają statyczne pola typu Age.It defines an Age structure and initializes two classes that have static fields of type Age. Druga klasa stosuje FixedAddressValueTypeAttribute, aby przypiąć adres pola.The second class applies FixedAddressValueTypeAttribute to pin the field's address. Wiele alokacji pamięci jest wykonywanych przed i po utworzeniu wystąpienia tych dwóch obiektów i wywołaniu modułu wyrzucania elementów bezużytecznych.A number of memory allocations are made before and after these two objects are instantiated and the garbage collector is invoked. Dane wyjściowe z przykładu pokazują, że mimo że adres pierwszego pola Age uległ zmianie po wyrzucaniu elementów bezużytecznych, adres pola, do którego FixedAddressValueTypeAttribute jest stosowany, nie jest.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

Uwagi

Użyj atrybutu FixedAddressValueTypeAttribute, aby oznaczyć statyczne typy wartości jako przypięte podczas tworzenia.Use the FixedAddressValueTypeAttribute attribute to mark static value types as pinned upon creation.

Ten atrybut jest używany przez kompilator wizualny C++ firmy Microsoft.This attribute is used by the Microsoft Visual C++ compiler.

Pola statycznego typu wartości są tworzone jako obiekty w ramce.Static value type fields are created as boxed objects. Oznacza to, że ich adresy mogą ulec zmianie, ponieważ jest wykonywane odzyskiwanie pamięci.This means that their address can change as garbage collection is performed. Po zastosowaniu tego atrybutu do typu wartości statycznej jego adres pozostaje stały w okresie istnienia.When you apply this attribute to a static value type, its address remains constant during its lifetime.

Konstruktory

FixedAddressValueTypeAttribute()

Inicjuje nowe wystąpienie klasy FixedAddressValueTypeAttribute klasy.Initializes a new instance of the FixedAddressValueTypeAttribute class.

Właściwości

TypeId

Po zaimplementowaniu w klasie pochodnej pobiera unikatowy identyfikator dla tego Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Odziedziczone po Attribute)

Metody

Equals(Object)

Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi.Returns a value that indicates whether this instance is equal to a specified object.

(Odziedziczone po Attribute)
GetHashCode()

Zwraca kod skrótu dla tego wystąpienia.Returns the hash code for this instance.

(Odziedziczone po Attribute)
GetType()

Pobiera Type bieżącego wystąpienia.Gets the Type of the current instance.

(Odziedziczone po Object)
IsDefaultAttribute()

Gdy jest zastępowany w klasie pochodnej, wskazuje, czy wartość tego wystąpienia jest wartością domyślną klasy pochodnej.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Odziedziczone po Attribute)
Match(Object)

Gdy jest zastępowany w klasie pochodnej, zwraca wartość wskazującą, czy to wystąpienie jest zgodne z określonym obiektem.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Odziedziczone po Attribute)
MemberwiseClone()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
ToString()

Zwraca ciąg, który reprezentuje bieżący obiekt.Returns a string that represents the current object.

(Odziedziczone po Object)

Jawne implementacje interfejsu

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Zestaw nazw jest mapowany na odpowiedni zestaw identyfikatorów wysyłania.Maps a set of names to a corresponding set of dispatch identifiers.

(Odziedziczone po Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Pobiera informacje o typie dla obiektu, którego można użyć do uzyskania informacji o typie dla interfejsu.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Odziedziczone po Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Pobiera informację o liczbie typów interfejsów, jakie zawiera obiekt (0 lub 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Odziedziczone po Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Umożliwia dostęp do właściwości i metod udostępnianych przez obiekt.Provides access to properties and methods exposed by an object.

(Odziedziczone po Attribute)

Dotyczy