Aracılığıyla paylaş


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öntemine uygulayabilirsiniz. Bu öznitelikle ek açıklama eklenmiş extern static yönteminin 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, extern static yönteminin gövdesi MissingFieldException veya MissingMethodExceptionoluşturur.

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

Methodiçin, StaticMethod, Fieldve StaticFieldiçin, ek açıklamalı extern static yönteminin 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şisinde eşleşme aranmıyor.

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

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

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

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

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

Eşleşme, ECMA-335bölüm II.23.2'de tanımlanan meta veri imzaları karşılaştırılarak belirlenir. 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 denenir. Bir belirsizlik hala varsa, AmbiguousMatchException oluşturulur.

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

Oluşturucular

UnsafeAccessorAttribute(UnsafeAccessorKind)

UnsafeAccessorKindtüründe bir üyeye erişim sağlayan bir UnsafeAccessorAttribute ö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ğer döndürür.

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

Bu örneğin karma kodunu döndürür.

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

Geçerli örneğin Type 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 Objectbasit bir kopyasını oluşturur.

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

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

(Devralındığı yer: Object)

Şunlara uygulanır