UnsafeAccessorAttribute Kelas

Definisi

Menyediakan akses ke anggota yang tidak dapat diakses dari jenis tertentu.

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
Warisan
UnsafeAccessorAttribute
Atribut

Contoh

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

Keterangan

Anda dapat menerapkan atribut ini ke extern static metode . Implementasi metode yang dianomasikan extern static dengan atribut ini akan disediakan oleh runtime berdasarkan informasi dalam atribut dan tanda tangan metode tempat atribut diterapkan. Runtime akan mencoba menemukan metode atau bidang yang cocok dan meneruskan panggilan ke dalamnya. Jika metode atau bidang yang cocok tidak ditemukan, isi extern static metode akan melempar MissingFieldException atau MissingMethodException.

Parameter generik didukung sejak .NET 9. Parameter generik harus cocok dengan target dalam bentuk dan indeks (yaitu, parameter jenis harus berupa parameter jenis dan parameter metode harus berupa parameter metode). Parameter extern static generik metode juga harus sama persis dengan batasan apa pun yang tercermin pada target. Jika batasan tidak cocok, metode akan melempar InvalidProgramException.

Untuk Method, , FieldStaticMethod, dan StaticField, jenis argumen pertama dari metode anotasi extern static mengidentifikasi jenis pemilik. Hanya jenis tertentu yang ditentukan yang akan diperiksa untuk anggota yang tidak dapat diakses. Hierarki jenis tidak berjalan mencari kecocokan.

Nilai argumen pertama diperlakukan sebagai this penunjuk untuk bidang dan metode instans.

Argumen pertama harus diteruskan sebagai ref untuk bidang instans dan metode pada struktur.

Nilai argumen pertama tidak digunakan oleh implementasi untuk static bidang dan metode dan dapat berupa null.

Nilai yang dikembalikan untuk pengaktor ke bidang bisa jika ref pengaturan bidang diinginkan.

Konstruktor dapat diakses menggunakan Constructor atau Method.

Jenis pengembalian dipertimbangkan untuk kecocokan tanda tangan. Modreq dan modopt awalnya tidak dipertimbangkan untuk kecocokan tanda tangan. Namun, jika ada ambiguitas yang mengabaikan modreq dan modopt, kecocokan yang tepat akan dicoba. Jika ambiguitas masih ada, AmbiguousMatchException dilemparkan.

Secara default, nama metode yang diatribusikan menentukan nama metode/bidang. Ini dapat menyebabkan kebingungan dalam beberapa kasus karena abstraksi bahasa, seperti fungsi lokal C#, menghasilkan nama IL yang terkelola. Solusi untuk ini adalah menggunakan nameof mekanisme dan menentukan Name properti .

Konstruktor

UnsafeAccessorAttribute(UnsafeAccessorKind)

Membuat instans memberikan UnsafeAccessorAttribute akses ke anggota dari jenis UnsafeAccessorKind.

Properti

Kind

Mendapatkan jenis anggota tempat akses disediakan.

Name

Mendapatkan atau menetapkan nama anggota tempat akses disediakan.

TypeId

Ketika diimplementasikan di kelas turunan, mendapatkan pengidentifikasi unik untuk ini Attribute.

(Diperoleh dari Attribute)

Metode

Equals(Object)

Mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
GetHashCode()

Mengembalikan kode hash untuk instans ini.

(Diperoleh dari Attribute)
GetType()

Mendapatkan dari instans Type saat ini.

(Diperoleh dari Object)
IsDefaultAttribute()

Ketika ditimpa di kelas turunan, menunjukkan apakah nilai instans ini adalah nilai default untuk kelas turunan.

(Diperoleh dari Attribute)
Match(Object)

Saat ditimpa di kelas turunan, mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
MemberwiseClone()

Membuat salinan dangkal dari saat ini Object.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk