Typy związane z pamięcią i zakresem
Począwszy od platformy .NET Core 2.1, platforma .NET zawiera wiele wzajemnie powiązanych typów, które reprezentują ciągły, silnie typizowany region dowolnej pamięci. Są one następujące:
System.Span<T>, typ używany do uzyskiwania dostępu do ciągłego regionu pamięci. Wystąpienie Span<T> może być obsługiwane przez tablicę typu
T
, String, bufor przydzielony z stosalloc lub wskaźnik do pamięci niezarządzanej. Ponieważ należy go przydzielić na stosie, ma wiele ograniczeń. Na przykład pole w klasie nie może być typu Span<T>, ani nie może być używane w operacjach asynchronicznych.System.ReadOnlySpan<T>, niezmienna wersja Span<T> struktury.
System.Memory<T>, otoka nad ciągłym regionem pamięci. Wystąpienie Memory<T> może być obsługiwane przez tablicę typu
T
, lub Stringmenedżera pamięci. Ponieważ można je przechowywać na zarządzanym stosie, Memory<T> nie ma żadnych ograniczeń programu Span<T>.System.ReadOnlyMemory<T>, niezmienna wersja Memory<T> struktury.
System.Buffers.MemoryPool<T>, który przydziela silnie typizowane bloki pamięci z puli pamięci do właściciela. IMemoryOwner<T> Wystąpienia można wynająć z puli, wywołując MemoryPool<T>.Rent i zwalniając z powrotem do puli przez wywołanie metody MemoryPool<T>.Dispose().
System.Buffers.IMemoryOwner<T>, który reprezentuje właściciela bloku pamięci i kontroluje zarządzanie okresem istnienia.
MemoryManager<T>, abstrakcyjna klasa bazowa, która może służyć do zastąpienia implementacji Memory<T> programu , dzięki czemu Memory<T> może być wspierana przez dodatkowe typy, takie jak bezpieczne dojścia. MemoryManager<T> jest przeznaczony dla zaawansowanych scenariuszy.
ArraySegment<T>, otoka dla określonej liczby elementów tablicy rozpoczynających się od określonego indeksu.
System.MemoryExtensions, kolekcja metod rozszerzenia do konwertowania ciągów, tablic i segmentów tablic na Memory<T> bloki.
System.Span<T>, System.Memory<T>i ich odpowiedniki readonly są zaprojektowane tak, aby umożliwić tworzenie algorytmów, które unikają kopiowania pamięci lub przydzielania na zarządzanym stercie więcej niż jest to konieczne. Tworzenie ich (za pośrednictwem Slice
konstruktorów lub ich konstruktorów) nie wiąże się z duplikowaniem bazowych buforów: aktualizowane są tylko odpowiednie odwołania i przesunięcia, które reprezentują "widok" opakowanej pamięci.
Uwaga
W przypadku wcześniejszych struktur i Memory<T> są dostępne w pakiecie Span<T>System.Memory NuGet.
Aby uzyskać więcej informacji, zobacz System.Buffers przestrzeń nazw.
Praca z pamięcią i zakresem
Ponieważ typy związane z pamięcią i zakresem są zwykle używane do przechowywania danych w potoku przetwarzania, ważne jest, aby deweloperzy przestrzegali zestawu najlepszych rozwiązań podczas korzystania z Span<T>typów , Memory<T>i powiązanych. Te najlepsze rozwiązania opisano w wytycznych dotyczących użycia funkcji MemoryT<> i SpanT<>.