UnsafeAccessorAttribute Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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
- 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk