UnsafeAccessorAttribute Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje přístup k nepřístupným členům určitého typu.
public ref class UnsafeAccessorAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
public sealed class UnsafeAccessorAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)>]
type UnsafeAccessorAttribute = class
inherit Attribute
Public NotInheritable Class UnsafeAccessorAttribute
Inherits Attribute
- Dědičnost
- Atributy
Příklady
public class Class
{
static void StaticPrivateMethod() { }
static int StaticPrivateField;
Class(int i) { PrivateField = i; }
void PrivateMethod() { }
int PrivateField;
int PrivateProperty { get => PrivateField; }
}
public void CallStaticPrivateMethod()
{
StaticPrivateMethod(null);
[UnsafeAccessor(UnsafeAccessorKind.StaticMethod, Name = nameof(StaticPrivateMethod))]
extern static void StaticPrivateMethod(Class c);
}
public void GetSetStaticPrivateField()
{
ref int f = ref GetSetStaticPrivateField(null);
[UnsafeAccessor(UnsafeAccessorKind.StaticField, Name = "StaticPrivateField")]
extern static ref int GetSetStaticPrivateField(Class c);
}
public void CallPrivateConstructor()
{
Class c1 = PrivateCtor(1);
Class c2 = (Class)RuntimeHelpers.GetUninitializedObject(typeof(Class));
PrivateCtorAsMethod(c2, 2);
[UnsafeAccessor(UnsafeAccessorKind.Constructor)]
extern static Class PrivateCtor(int i);
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void PrivateCtorAsMethod(Class c, int i);
}
public void CallPrivateMethod(Class c)
{
PrivateMethod(c);
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = nameof(PrivateMethod))]
extern static void PrivateMethod(Class c);
}
public void GetPrivateProperty(Class c)
{
int f = GetPrivateProperty(c);
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "get_PrivateProperty")]
extern static int GetPrivateProperty(Class c);
}
public void GetSetPrivateField(Class c)
{
ref int f = ref GetSetPrivateField(c);
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "PrivateField")]
extern static ref int GetSetPrivateField(Class c);
}
// Generic example
public class Class<T>
{
private T _field;
private void M(T t) { }
private void GM<U>(U u) { }
private void GMWithConstraints<U, V>(U u, V v) where U : V, IEquatable<U> { }
}
class Accessors<V>
{
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_field")]
public extern static ref V GetSetPrivateField(Class<V> c);
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "M")]
public extern static void CallM(Class<V> c, V v);
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "GM")]
public extern static void CallGM<X>(Class<V> c, X x);
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "GMWithConstraints")]
public extern static void CallGMWithConstraints<X, Y>(Class<V> c, X x, Y y) where X : Y, IEquatable<X>;
}
public void AccessGenericType(Class<int> c)
{
ref int f = ref Accessors<int>.GetSetPrivateField(c);
Accessors<int>.CallM(c, 1);
Accessors<int>.CallGM<string>(c, string.Empty);
Accessors<int>.CallGMWithConstraints<string, object>(c, string.Empty, new object());
}
Poznámky
Tento atribut můžete použít u metody extern static
. Implementace extern static
metody anotace s tímto atributem bude poskytována modulem runtime na základě informací v atributu a podpisu metody, na kterou je atribut použit. Modul runtime se pokusí najít odpovídající metodu nebo pole a přesměrovat do něj volání. Pokud není nalezena odpovídající metoda nebo pole, tělo metody extern static
vyvolá MissingFieldException nebo MissingMethodException.
Obecné parametry jsou podporované od verze .NET 9. Obecné parametry musí odpovídat cíli ve formuláři a indexu (to znamená, že parametry typu musí být parametry typu a parametry metody musí být parametry metody). Obecné parametry metody extern static
také musí přesně odpovídat všem omezením, která se projeví v cíli. Pokud se omezení neshodují, metoda vyvolá InvalidProgramException.
Pro Method, StaticMethod, Fielda StaticField, typ prvního argumentu anotované extern static
metoda identifikuje vlastní typ. Pro nepřístupné členy se prověří pouze konkrétní typ definovaný. Hierarchie typů není procházaná hledáním shody.
Hodnota prvního argumentu je považována za this
ukazatel pro pole a metody instance.
První argument musí být předán jako ref
pro pole a metody instance struktur.
Hodnota prvního argumentu není použita implementací pro static
pole a metody a může být null
.
Návratová hodnota pro přístup k poli může být ref
, pokud je požadované nastavení pole.
Konstruktory lze získat přístup pomocí Constructor nebo Method.
Shoda je určena porovnáním podpisů metadat definovaných v oddílu II.23.2 ECMA-335. Návratový typ se považuje za shodu podpisu. Modreqs a modopty se zpočátku nepovažují za shodu podpisu. Pokud však existuje nejednoznačnost ignorování modreqs a modopts, pokusí se o přesnou shodu. Pokud stále existuje nejednoznačnost, AmbiguousMatchException je vyvolán.
Ve výchozím nastavení název atributové metody určuje název metody nebo pole. To může v některých případech způsobit nejasnosti, protože abstrakce jazyka, jako jsou místní funkce jazyka C#, generují mangled IL názvy. Řešením je použít mechanismus nameof
a definovat vlastnost Name.
Konstruktory
UnsafeAccessorAttribute(UnsafeAccessorKind) |
Vytvoří instanci UnsafeAccessorAttribute poskytující přístup k členovi typu UnsafeAccessorKind. |
Vlastnosti
Kind |
Získá typ člena, ke kterému je poskytnut přístup. |
Name |
Získá nebo nastaví název člena, ke kterému je přístup poskytnut. |
TypeId |
Při implementaci v odvozené třídě získá jedinečný identifikátor pro tento Attribute. (Zděděno od Attribute) |
Metody
Equals(Object) |
Vrátí hodnotu, která určuje, zda je tato instance rovna zadanému objektu. (Zděděno od Attribute) |
GetHashCode() |
Vrátí kód hash pro tuto instanci. (Zděděno od Attribute) |
GetType() |
Získá Type aktuální instance. (Zděděno od Object) |
IsDefaultAttribute() |
Při přepsání v odvozené třídě určuje, zda hodnota této instance je výchozí hodnotou pro odvozenou třídu. (Zděděno od Attribute) |
Match(Object) |
Při přepsání v odvozené třídě vrátí hodnotu, která určuje, zda se tato instance rovná zadanému objektu. (Zděděno od Attribute) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Object. (Zděděno od Object) |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |