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önteme uygulayabilirsiniz. Bu öznitelikle ek açıklama eklenen yöntemin extern static
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, yöntemin extern static
gövdesi veya MissingMethodExceptionoluştururMissingFieldException.
.NET 9'dan bu yana genel parametreler desteklenir. Genel parametreler form ve dizindeki hedefle eşleşmelidir (yani, tür parametreleri tür parametreleri olmalı ve yöntem parametreleri yöntem parametreleri olmalıdır). Yöntemin extern static
genel parametreleri de hedefe yansıtılan tüm kısıtlamalarla tam olarak eşleşmelidir. Kısıtlamalar eşleşmezse yöntemi oluşturur InvalidProgramException.
, MethodStaticMethod, Fieldve StaticFieldiçin, ek açıklamalı extern static
yöntemin 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şisi eşleşme ararken izlenmiyor.
İlk bağımsız değişkenin değeri, örnek alanları ve yöntemleri için işaretçi olarak this
kabul edilir.
İlk bağımsız değişken, yapılardaki örnek alanları ve yöntemleri için olarak ref
geçirilmelidir.
İlk bağımsız değişkenin değeri, alanlar ve yöntemler için static
uygulama tarafından kullanılmaz ve olabilir null
.
Alanın ayarlanması isteniyorsa, bir alana erişimcinin dönüş değeri olabilir ref
.
Oluşturuculara veya Methodkullanılarak Constructor erişilebilir.
dönüş türü, imza eşleşmesi için dikkate alınır. Modreqs ve modopt'lar başlangıçta imza eşleşmesi için dikkate alınmaz. Ancak, modreqs ve modopt'lar yoksayılarak bir belirsizlik varsa, kesin bir eşleşme denenmiştir. Bir belirsizlik hala varsa, AmbiguousMatchException oluşturulur.
Varsayılan olarak, öznitelikli yöntemin adı yöntemin/alanın adını belirler. C# yerel işlevleri gibi dil soyutlamaları karışık IL adları oluşturduğundan bu durum bazı durumlarda karışıklığa neden olabilir. Bunun çözümü mekanizmayı nameof
kullanmak ve özelliğini tanımlamaktır Name .
Oluşturucular
UnsafeAccessorAttribute(UnsafeAccessorKind) |
türünde UnsafeAccessorKindbir UnsafeAccessorAttribute üyeye erişim sağlayan bir ö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ğeri döndürür. (Devralındığı yer: Attribute) |
GetHashCode() |
Bu örneğe ilişkin karma kodu döndürür. (Devralındığı yer: Attribute) |
GetType() |
Type Geçerli örneğini 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 Objectöğesinin sığ bir kopyasını oluşturur. (Devralındığı yer: Object) |
ToString() |
Geçerli nesneyi temsil eden dizeyi döndürür. (Devralındığı yer: Object) |
Şunlara uygulanır
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin