Unsafe Sınıf

Tanım

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 TTobir değere yeni bir yönetilen işaretçi olarak yeniden yorumlar.

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 Tbir değere dönüştürür.

BitCast<TFrom,TTo>(TFrom)

Türün verilen değerini türündeki TFrom bir değer TToolarak yeniden yorumlar.

ByteOffset<T>(T, T)

Verilen yönetilen işaretçilerden kaynaktan hedefe bayt uzaklığını belirler.

Copy<T>(T, Void*)

Türündeki T bir değeri verilen konuma kopyalar.

Copy<T>(Void*, T)

Türündeki T bir değeri verilen konuma kopyalar.

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 T değerine yönelik belirli bir yönetilen işaretçinin null başvuru olup olmadığını belirler.

NullRef<T>()

türünde Tbir değere null yönetilen işaretçi döndürür.

Read<T>(Void*)

Verilen konumdan tür T değerini okur.

ReadUnaligned<T>(Byte)

Kaynak adresin mimariye bağımlı hizalaması varsayılmadan verilen adresten tür T değerini okur.

ReadUnaligned<T>(Void*)

Kaynak adresin mimariye bağımlı hizalaması varsayılmadan verilen konumdan tür T değerini okur.

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 mutable ref döndürür.

Write<T>(Void*, T)

Verilen konuma türünde T bir değer yazar.

WriteUnaligned<T>(Byte, T)

Hedef adresin mimariye bağımlı hizalaması varsayılmadan verilen konuma türünde T bir değer yazar.

WriteUnaligned<T>(Void*, T)

Hedef adresin mimariye bağımlı hizalaması varsayılmadan verilen konuma türünde T bir değer yazar.

Şunlara uygulanır