UnsafeAccessorAttribute Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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
- Ö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 null
olabilir.
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-335
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) |