UnsafeAccessorAttribute Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет доступ к недоступному члену определенного типа.
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
- Наследование
- Атрибуты
Примеры
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());
}
Комментарии
Этот атрибут можно применить к методу extern static
. Реализация метода, extern static
помеченного этим атрибутом, будет предоставляться средой выполнения на основе сведений в атрибуте и сигнатуры метода, к которому применяется атрибут. Среда выполнения попытается найти соответствующий метод или поле и перенаправит на него вызов. Если соответствующий метод или поле не найдены, тело extern static
метода вызовет MissingFieldException или MissingMethodException.
Универсальные параметры поддерживаются начиная с .NET 9. Универсальные параметры должны соответствовать целевому объекту по форме и индексу (то есть параметры типа должны быть параметрами типа, а параметры метода — параметрами метода). Универсальные extern static
параметры метода также должны точно соответствовать любым ограничениям, отраженным в целевом объекте. Если ограничения не совпадают, метод выдает исключение InvalidProgramException.
Для Method, StaticMethod, Fieldи StaticFieldтип первого аргумента аннотированного extern static
метода определяет тип-владение. На наличие недоступных элементов будет проверяться только определенный определенный тип. Иерархия типов не просматривается в поисках соответствия.
Значение первого аргумента обрабатывается как this
указатель для полей и методов экземпляра.
Первый аргумент должен передаваться как ref
для полей и методов экземпляра в структуре.
Значение первого аргумента не используется реализацией для static
полей и методов и может иметь значение null
.
Возвращаемое значение метода доступа к полю может иметь значение ref
, если требуется настройка поля.
Доступ к конструкторам можно получить с помощью Constructor или Method.
Тип возвращаемого значения считается для соответствия сигнатуры. Modreqs и modopts изначально не учитываются для совпадения сигнатур. Однако если существует неоднозначность, игнорирующая modreqs и modopts, предпринимается попытка точного совпадения. Если неоднозначность все еще существует, AmbiguousMatchException возникает исключение .
По умолчанию имя метода с атрибутами определяет имя метода или поля. В некоторых случаях это может привести к путанице, так как абстракции языка, такие как локальные функции C#, создают искаженные имена IL. Решением этой проблемы является использование nameof
механизма и определение Name свойства .
Конструкторы
UnsafeAccessorAttribute(UnsafeAccessorKind) |
Создает экземпляр , предоставляющий UnsafeAccessorAttribute доступ к члену типа UnsafeAccessorKind. |
Свойства
Kind |
Возвращает тип элемента, к которому предоставляется доступ. |
Name |
Возвращает или задает имя члена, которому предоставляется доступ. |
TypeId |
В случае реализации в производном классе возвращает уникальный идентификатор для этого атрибута Attribute. (Унаследовано от Attribute) |
Методы
Equals(Object) |
Возвращает значение, показывающее, равен ли экземпляр указанному объекту. (Унаследовано от Attribute) |
GetHashCode() |
Возвращает хэш-код данного экземпляра. (Унаследовано от Attribute) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
IsDefaultAttribute() |
При переопределении в производном классе указывает, является ли значение этого экземпляра значением по умолчанию для производного класса. (Унаследовано от Attribute) |
Match(Object) |
При переопределении в производном классе возвращает значение, указывающее, является ли этот экземпляр равным заданному объекту. (Унаследовано от Attribute) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Применяется к
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по