UnsafeAccessorAttribute Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit l’accès à un membre inaccessible d’un type spécifique.
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
- Héritage
- Attributs
Exemples
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());
}
Remarques
Vous pouvez appliquer cet attribut à une extern static
méthode. L’implémentation de la extern static
méthode annotée avec cet attribut sera fournie par le runtime en fonction des informations contenues dans l’attribut et de la signature de la méthode à laquelle l’attribut est appliqué. Le runtime tente de trouver la méthode ou le champ correspondant et lui transfère l’appel. Si la méthode ou le champ correspondant est introuvable, le corps de la extern static
méthode lève MissingFieldException ou MissingMethodException.
Les paramètres génériques sont pris en charge depuis .NET 9. Les paramètres génériques doivent correspondre à la cible dans la forme et l’index (autrement dit, les paramètres de type doivent être des paramètres de type et les paramètres de méthode doivent être des paramètres de méthode). Les extern static
paramètres génériques de la méthode doivent également correspondre exactement à toutes les contraintes reflétées sur la cible. Si les contraintes ne correspondent pas, la méthode lève InvalidProgramException.
Pour Method, StaticMethod, Fieldet StaticField, le type du premier argument de la méthode annotée extern static
identifie le type propriétaire. Seul le type spécifique défini sera examiné pour les membres inaccessibles. La hiérarchie de types n’est pas parcourue à la recherche d’une correspondance.
La valeur du premier argument est traitée comme this
pointeur pour instance champs et méthodes.
Le premier argument doit être passé comme ref
pour instance les champs et les méthodes sur les structs.
La valeur du premier argument n’est pas utilisée par l’implémentation pour static
les champs et les méthodes et peut être null
.
La valeur de retour d’un accesseur à un champ peut être ref
si le paramètre du champ est souhaité.
Les constructeurs sont accessibles à l’aide de Constructor ou Method.
Le type de retour est pris en compte pour la correspondance de signature. Les modreqs et modopts ne sont initialement pas pris en compte pour la correspondance de signature. Toutefois, si une ambiguïté existe en ignorant les modreqs et modopts, une correspondance précise est tentée. Si une ambiguïté existe toujours, AmbiguousMatchException est levée.
Par défaut, le nom de la méthode attribuée dicte le nom de la méthode/du champ. Cela peut causer de la confusion dans certains cas, car les abstractions de langage, telles que les fonctions locales C#, génèrent des noms il entregles. La solution consiste à utiliser le nameof
mécanisme et à définir la Name propriété.
Constructeurs
UnsafeAccessorAttribute(UnsafeAccessorKind) |
Instancie un UnsafeAccessorAttribute fournissant l’accès à un membre de type UnsafeAccessorKind. |
Propriétés
Kind |
Obtient le type de membre auquel l’accès est fourni. |
Name |
Obtient ou définit le nom du membre auquel l’accès est fourni. |
TypeId |
Lors de l'implémentation dans une classe dérivée, obtient un identificateur unique pour l'objet Attribute. (Hérité de Attribute) |
Méthodes
Equals(Object) |
Retourne une valeur qui indique si cette instance est égale à un objet spécifié. (Hérité de Attribute) |
GetHashCode() |
Retourne le code de hachage de cette instance. (Hérité de Attribute) |
GetType() |
Obtient le Type de l'instance actuelle. (Hérité de Object) |
IsDefaultAttribute() |
En cas de substitution dans une classe dérivée, indique si la valeur de cette instance est la valeur par défaut pour la classe dérivée. (Hérité de Attribute) |
Match(Object) |
En cas de substitution dans une classe dérivée, retourne une valeur indiquant si cette instance équivaut à un objet spécifié. (Hérité de Attribute) |
MemberwiseClone() |
Crée une copie superficielle du Object actuel. (Hérité de Object) |
ToString() |
Retourne une chaîne qui représente l'objet actuel. (Hérité de Object) |
S’applique à
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour