UnsafeAccessorAttribute Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia dostęp do niedostępnego elementu członkowskiego określonego 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
- Dziedziczenie
- Atrybuty
Przykłady
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());
}
Uwagi
Ten atrybut można zastosować do extern static
metody . Implementacja extern static
metody z adnotacją o tym atrybucie zostanie udostępniona przez środowisko uruchomieniowe na podstawie informacji w atrybucie i podpis metody, do którego jest stosowany atrybut. Środowisko uruchomieniowe spróbuje znaleźć zgodną metodę lub pole i przekazać do niego wywołanie. Jeśli nie można odnaleźć pasującej metody lub pola, treść extern static
metody zwróci MissingFieldException wartość lub MissingMethodException.
Parametry ogólne są obsługiwane od platformy .NET 9. Parametry ogólne muszą być zgodne z obiektem docelowym w postaci i indeksie (czyli parametry typu muszą być parametrami typu, a parametry metody muszą być parametrami metody). extern static
Parametry ogólne metody muszą również dokładnie odpowiadać wszelkim ograniczeniom odzwierciedlonym w obiekcie docelowym. Jeśli ograniczenia nie są zgodne, metoda zgłasza wyjątek InvalidProgramException.
W przypadku Methodmetod , , StaticMethodFieldi StaticFieldtyp pierwszego argumentu metody z adnotacjami extern static
identyfikuje typ będącą właścicielem. Tylko określony typ zdefiniowany zostanie zbadany pod kątem niedostępnych elementów członkowskich. Hierarchia typów nie jest wyszukiwana pod kątem dopasowania.
Wartość pierwszego argumentu jest traktowana jako this
wskaźnik dla pól i metod wystąpień.
Pierwszy argument musi zostać przekazany jako ref
dla pól wystąpień i metod w strukturach.
Wartość pierwszego argumentu nie jest używana przez implementację dla static
pól i metod i może być null
.
Wartość zwracana dla metody dostępu do pola może być ref
taka, jeśli wymagane jest ustawienie pola.
Dostęp do konstruktorów można uzyskać za pomocą polecenia Constructor lub Method.
Zwracany typ jest uznawany za zgodny z podpisem. Modreqs i modopts początkowo nie są brane pod uwagę pod kątem dopasowania podpisu. Jeśli jednak istnieje niejednoznaczność ignorując modreqs i modopts, zostanie podjęta dokładna próba dopasowania. Jeśli niejednoznaczność nadal istnieje, AmbiguousMatchException jest zgłaszana.
Domyślnie nazwa metody przypisanej określa nazwę metody/pola. Może to spowodować zamieszanie w niektórych przypadkach, ponieważ abstrakcje języka, takie jak funkcje lokalne języka C#, generują mangled nazw IL. Rozwiązaniem tego problemu nameof
jest użycie mechanizmu i zdefiniowanie Name właściwości.
Konstruktory
UnsafeAccessorAttribute(UnsafeAccessorKind) |
Tworzy wystąpienie UnsafeAccessorAttribute elementu zapewniającego dostęp do elementu członkowskiego rodzaju UnsafeAccessorKind. |
Właściwości
Kind |
Pobiera rodzaj elementu członkowskiego, do którego jest zapewniany dostęp. |
Name |
Pobiera lub ustawia nazwę elementu członkowskiego, do którego jest udostępniany dostęp. |
TypeId |
Po zaimplementowaniu w klasie pochodnej pobiera unikatowy identyfikator dla tego Attributeelementu . (Odziedziczone po Attribute) |
Metody
Equals(Object) |
Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi. (Odziedziczone po Attribute) |
GetHashCode() |
Zwraca wartość skrótu dla tego wystąpienia. (Odziedziczone po Attribute) |
GetType() |
Type Pobiera wartość bieżącego wystąpienia. (Odziedziczone po Object) |
IsDefaultAttribute() |
Podczas zastępowania w klasie pochodnej wskazuje, czy wartość tego wystąpienia jest wartością domyślną dla klasy pochodnej. (Odziedziczone po Attribute) |
Match(Object) |
Po przesłonięciu w klasie pochodnej zwraca wartość wskazującą, czy to wystąpienie jest równe określonemu obiektowi. (Odziedziczone po Attribute) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Dotyczy
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla