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 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) |