Bagikan melalui


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 metode extern static. Implementasi metode extern static yang dianotasi 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 metode extern static akan melemparkan MissingFieldException atau MissingMethodException.

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

Untuk Method, StaticMethod, Field, dan StaticField, jenis argumen pertama dari metode extern static yang dianomasikan 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 pointer 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 bidang dan metode static dan dapat null.

Nilai pengembalian untuk aksesor ke bidang dapat ref jika pengaturan bidang diinginkan.

Konstruktor dapat diakses menggunakan Constructor atau Method.

Kecocokan ditentukan dengan membandingkan tanda tangan metadata seperti yang didefinisikan dalam bagian II.23.2 ECMA-335. Jenis pengembalian dipertimbangkan untuk kecocokan tanda tangan. Modreq dan modopt awalnya tidak dipertimbangkan untuk kecocokan tanda tangan. Namun, jika ada ambiguitas mengabaikan modreq dan modopt, kecocokan yang tepat 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 bergumpal. Solusi untuk ini adalah menggunakan mekanisme nameof dan menentukan properti Name.

Konstruktor

UnsafeAccessorAttribute(UnsafeAccessorKind)

Membuat instans UnsafeAccessorAttribute menyediakan akses ke anggota jenis UnsafeAccessorKind.

Properti

Kind

Mendapatkan jenis anggota tempat akses disediakan.

Name

Mendapatkan atau menetapkan nama anggota tempat akses disediakan.

TypeId

Ketika diimplementasikan dalam kelas turunan, mendapatkan pengidentifikasi unik untuk Attributeini.

(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 Type instans saat ini.

(Diperoleh dari Object)
IsDefaultAttribute()

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

(Diperoleh dari Attribute)
Match(Object)

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

(Diperoleh dari Attribute)
MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk