UnsafeAccessorAttribute Sınıf

Tanım

Belirli bir türün erişilemez bir üyesine erişim sağlar.

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
Devralma
UnsafeAccessorAttribute
Öznitelikler

Örnekler

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());
}

Açıklamalar

Bu özniteliği bir extern static yönteme uygulayabilirsiniz. Bu öznitelikle ek açıklama eklenen yöntemin extern static uygulanması, özniteliğindeki bilgilere ve özniteliğin uygulandığı yöntemin imzasına göre çalışma zamanı tarafından sağlanacaktır. Çalışma zamanı eşleşen yöntemi veya alanı bulmaya çalışır ve çağrıyı buna iletir. Eşleşen yöntem veya alan bulunamazsa, yöntemin extern static gövdesi veya MissingMethodExceptionoluştururMissingFieldException.

.NET 9'dan bu yana genel parametreler desteklenir. Genel parametreler form ve dizindeki hedefle eşleşmelidir (yani, tür parametreleri tür parametreleri olmalı ve yöntem parametreleri yöntem parametreleri olmalıdır). Yöntemin extern static genel parametreleri de hedefe yansıtılan tüm kısıtlamalarla tam olarak eşleşmelidir. Kısıtlamalar eşleşmezse yöntemi oluşturur InvalidProgramException.

, MethodStaticMethod, Fieldve StaticFieldiçin, ek açıklamalı extern static yöntemin ilk bağımsız değişkeninin türü, sahip olan türü tanımlar. Erişilemeyen üyeler için yalnızca tanımlanan belirli tür incelenir. Tür hiyerarşisi eşleşme ararken izlenmiyor.

İlk bağımsız değişkenin değeri, örnek alanları ve yöntemleri için işaretçi olarak this kabul edilir.

İlk bağımsız değişken, yapılardaki örnek alanları ve yöntemleri için olarak ref geçirilmelidir.

İlk bağımsız değişkenin değeri, alanlar ve yöntemler için static uygulama tarafından kullanılmaz ve olabilir null.

Alanın ayarlanması isteniyorsa, bir alana erişimcinin dönüş değeri olabilir ref .

Oluşturuculara veya Methodkullanılarak Constructor erişilebilir.

dönüş türü, imza eşleşmesi için dikkate alınır. Modreqs ve modopt'lar başlangıçta imza eşleşmesi için dikkate alınmaz. Ancak, modreqs ve modopt'lar yoksayılarak bir belirsizlik varsa, kesin bir eşleşme denenmiştir. Bir belirsizlik hala varsa, AmbiguousMatchException oluşturulur.

Varsayılan olarak, öznitelikli yöntemin adı yöntemin/alanın adını belirler. C# yerel işlevleri gibi dil soyutlamaları karışık IL adları oluşturduğundan bu durum bazı durumlarda karışıklığa neden olabilir. Bunun çözümü mekanizmayı nameof kullanmak ve özelliğini tanımlamaktır Name .

Oluşturucular

UnsafeAccessorAttribute(UnsafeAccessorKind)

türünde UnsafeAccessorKindbir UnsafeAccessorAttribute üyeye erişim sağlayan bir örneği oluşturur.

Özellikler

Kind

Erişimin sağlandığı üye türünü alır.

Name

Erişimin sağlandığı üyenin adını alır veya ayarlar.

TypeId

Türetilmiş bir sınıfta uygulandığında, bu Attributeiçin benzersiz bir tanımlayıcı alır.

(Devralındığı yer: Attribute)

Yöntemler

Equals(Object)

Bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değeri döndürür.

(Devralındığı yer: Attribute)
GetHashCode()

Bu örneğe ilişkin karma kodu döndürür.

(Devralındığı yer: Attribute)
GetType()

Type Geçerli örneğini alır.

(Devralındığı yer: Object)
IsDefaultAttribute()

Türetilmiş bir sınıfta geçersiz kılındığında, bu örneğin değerinin türetilmiş sınıf için varsayılan değer olup olmadığını gösterir.

(Devralındığı yer: Attribute)
Match(Object)

Türetilmiş bir sınıfta geçersiz kılındığında, bu örneğin belirtilen bir nesneye eşit olup olmadığını gösteren bir değer döndürür.

(Devralındığı yer: Attribute)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

(Devralındığı yer: Object)

Şunlara uygulanır