Unsafe 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.
Yönetilen ve yönetilmeyen işaretçileri işlemek için genel, alt düzey işlevler içerir.
public ref class Unsafe abstract sealed
public static class Unsafe
type Unsafe = class
Public Class Unsafe
- Devralma
-
Unsafe
Açıklamalar
Uyarı
Bu tür gelişmiş işaretçi işleme senaryoları için tasarlanmıştır. Arayanların ECMA-335, Sn. II.14.4 ve III.1.1.5 ve ECMA-335 CLI Belirtimi Eki hakkında bilgi sahibi oldukları varsayılır.
Bu türdeki ÇOĞU API, herhangi bir bağımsız değişken denetimi veya doğrulama gerçekleştirmez. Bu API'lerin yanlış kullanılması işlem belleğini bozabilir veya .NET çalışma zamanının dengesini bozabilir.
Bu tür genellikle yüksek performanslı kod yazmak isteyen ve gizlemeye istekli olan alt düzey kitaplık yazarları tarafından kullanılır. NET'in performans hedeflerine ulaşmak için tipik tür güvenlik denetimleri.
içindeki Span<T>
öğeleri tersine çeviren aşağıdaki örneği göz önünde bulundurun.
Not
Bu örnekler yalnızca tanıtım amaçlıdır. Gerçek dünyadaki uygulamalarda geliştiriciler bunun yerine, bu örneklerden bile daha iyileştirilmiş olan gibi Reverseyardımcı işlevleri kullanmalıdır.
// A safe, verifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
while (span.Length > 1)
{
T firstElement = span[0];
T lastElement = span[^1];
span[0] = lastElement;
span[^1] = firstElement;
span = span[1..^1];
}
}
Bu yöntem tam tür açısından güvenlidir ve .NET çalışma zamanı güvenliği zorlamaya yardımcı olmak için sınır denetimleri ekleyebilir. Ancak, alt düzey kitaplık yazarları öğesinin gösterilmemesini isteyebilir. KENDI kodunun performansını geliştirmek için NET'in normal güvenlik denetimleri. Bu tür geliştiriciler genellikle doğruluğun uygulanmasına yardımcı olmak için statik analiz araçlarına veya kendi kod incelemelerine güvenir. API'ler Unsafe
, aşağıdaki örnekte gösterildiği gibi bir geliştiricinin bu kodu, onaylanamayan yapıları kullanarak yeniden yazmasına olanak sağlar.
// A correct but unverifiable way to reverse a Span<T>.
static void Reverse<T>(Span<T> span)
{
if (span.Length > 1)
{
ref T refLeft = ref MemoryMarshal.GetReference(span);
ref T refRight = ref Unsafe.Add(ref refLeft, span.Length - 1);
do
{
T leftElement = refLeft;
T rightElement = refRight;
refLeft = rightElement;
refRight = leftElement;
refLeft = ref Unsafe.Add(ref refLeft, 1);
refRight = ref Unsafe.Subtract(ref refRight, 1);
} while (Unsafe.IsAddressLessThan(ref refLeft, ref refRight));
}
}
API'ler tipik tür güvenliği doğrulamasını Unsafe
gizlediğinden, yazdıkları kodun yasal olduğundan emin olmak arayanlara bağlıdır. Bu API'lerin kötüye kullanılması erişim ihlallerine neden olabilir, GC delikleri oluşturabilir, yanlış codegen oluşturabilir veya .NET çalışma zamanı içinde tanımlanmamış ve istikrarsız davranışlara neden olabilir.
Yöntemler
Add<T>(T, Int32) |
Verilen yönetilen işaretçiye bir uzaklık ekler. |
Add<T>(T, IntPtr) |
Verilen yönetilen işaretçiye bir öğe uzaklığı ekler. |
Add<T>(T, UIntPtr) |
Verilen yönetilen işaretçiye bir öğe uzaklığı ekler. |
Add<T>(Void*, Int32) |
Verilen yönetilmeyen işaretçiye bir öğe uzaklığı ekler. |
AddByteOffset<T>(T, IntPtr) |
Verilen yönetilen işaretçiye bayt uzaklığı ekler. |
AddByteOffset<T>(T, UIntPtr) |
Verilen yönetilen işaretçiye bayt uzaklığı ekler. |
AreSame<T>(T, T) |
Belirtilen yönetilen işaretçilerin aynı konuma işaret edip etmediğini belirler. |
As<T>(Object) |
Verilen nesneyi belirtilen türe dönüştürür. |
As<TFrom,TTo>(TFrom) |
Verilen yönetilen işaretçiyi türündeki |
AsPointer<T>(T) |
Yönetilen işaretçiyi yönetilmeyen bir işaretçiye dönüştürür. |
AsRef<T>(T) |
Verilen salt okunur başvuruyu değiştirilebilir başvuru olarak yeniden yorumlar. |
AsRef<T>(Void*) |
Yönetilmeyen bir işaretçiyi yönetilen işaretçiye türünde |
BitCast<TFrom,TTo>(TFrom) |
Türün verilen değerini türündeki |
ByteOffset<T>(T, T) |
Verilen yönetilen işaretçilerden kaynaktan hedefe bayt uzaklığını belirler. |
Copy<T>(T, Void*) |
Türündeki |
Copy<T>(Void*, T) |
Türündeki |
CopyBlock(Byte, Byte, UInt32) |
Baytları kaynak adresten hedef adrese kopyalar. |
CopyBlock(Void*, Void*, UInt32) |
Baytları kaynak adresten hedef adrese kopyalar. |
CopyBlockUnaligned(Byte, Byte, UInt32) |
Adreslerin mimariye bağımlı hizalaması varsayılmadan kaynak adresten hedef adrese bayt kopyalar. |
CopyBlockUnaligned(Void*, Void*, UInt32) |
Adreslerin mimariye bağımlı hizalaması varsayılmadan kaynak adresten hedef adrese bayt kopyalar. |
InitBlock(Byte, Byte, UInt32) |
Verilen konumda belirli bir başlangıç değeriyle bir bellek bloğu başlatır. |
InitBlock(Void*, Byte, UInt32) |
Verilen konumda belirli bir başlangıç değeriyle bir bellek bloğu başlatır. |
InitBlockUnaligned(Byte, Byte, UInt32) |
Adresin mimariye bağımlı hizalaması varsayılmadan, verilen konumda belirli bir başlangıç değeriyle bir bellek bloğu başlatır. |
InitBlockUnaligned(Void*, Byte, UInt32) |
Adresin mimariye bağımlı hizalaması varsayılmadan, verilen konumda belirli bir başlangıç değeriyle bir bellek bloğu başlatır. |
IsAddressGreaterThan<T>(T, T) |
Belirtilen yönetilen işaretçinin başka bir belirtilen yönetilen işaretçiden daha büyük olup olmadığını gösteren bir değer döndürür. |
IsAddressLessThan<T>(T, T) |
Belirtilen yönetilen işaretçinin belirtilen başka bir yönetilen işaretçiden küçük olup olmadığını gösteren bir değer döndürür. |
IsNullRef<T>(T) |
Türün |
NullRef<T>() |
türünde |
Read<T>(Void*) |
Verilen konumdan tür |
ReadUnaligned<T>(Byte) |
Kaynak adresin mimariye bağımlı hizalaması varsayılmadan verilen adresten tür |
ReadUnaligned<T>(Void*) |
Kaynak adresin mimariye bağımlı hizalaması varsayılmadan verilen konumdan tür |
SizeOf<T>() |
Verilen tür parametresinin değerinin boyutunu döndürür. |
SkipInit<T>(T) |
Belirli bir başvuru için kesin atama kurallarını atlar. |
Subtract<T>(T, Int32) |
Belirli bir yönetilen işaretçiden uzaklığı çıkarır. |
Subtract<T>(T, IntPtr) |
Belirli bir yönetilen işaretçiden bir öğe uzaklığını çıkarır. |
Subtract<T>(T, UIntPtr) |
Belirli bir yönetilen işaretçiden bir öğe uzaklığını çıkarır. |
Subtract<T>(Void*, Int32) |
Belirli bir yönetilmeyen işaretçiden bir öğe uzaklığını çıkarır. |
SubtractByteOffset<T>(T, IntPtr) |
Verilen yönetilen işaretçiden bayt uzaklığını çıkarır. |
SubtractByteOffset<T>(T, UIntPtr) |
Verilen yönetilen işaretçiden bayt uzaklığını çıkarır. |
Unbox<T>(Object) |
Kutulanmış değere bir |
Write<T>(Void*, T) |
Verilen konuma türünde |
WriteUnaligned<T>(Byte, T) |
Hedef adresin mimariye bağımlı hizalaması varsayılmadan verilen konuma türünde |
WriteUnaligned<T>(Void*, T) |
Hedef adresin mimariye bağımlı hizalaması varsayılmadan verilen konuma türünde |