Span<T> Struct-datatyp

Definition

Ger en typsäker och minnessäker representation av en sammanhängande region med godtyckligt minne.

generic <typename T>
public value class Span
[System.Runtime.InteropServices.Marshalling.NativeMarshalling(typeof(System.Runtime.InteropServices.Marshalling.SpanMarshaller<,>))]
public readonly ref struct Span<T>
public readonly ref struct Span<T>
[<System.Runtime.InteropServices.Marshalling.NativeMarshalling(typeof(System.Runtime.InteropServices.Marshalling.SpanMarshaller<,>))>]
type Span<'T> = struct
type Span<'T> = struct
Public Structure Span(Of T)

Typparametrar

T

Typ av objekt i Span<T>.

Arv
Span<T>
Attribut

Kommentarer

Typen Span<T> är en ref struct som allokeras på stacken istället för på den hanterade högen. Referensstruktureringstyper har vissa begränsningar för att säkerställa att de inte kan befordras till den hanterade heapen, inklusive att de inte kan vara:

  • Boxed.
  • Tilldelad till variabler av typen Object eller dynamic, eller till någon gränssnittstyp.
  • Fält i en referenstyp.
  • Används över await och yield gränser.

Dessutom kastar anrop till två metoder, Equals(Object) och GetHashCode, en NotSupportedException.

Important

Eftersom Span<T> är en stacktyp är det olämpligt för många scenarier som kräver lagring av referenser till buffertar på heapen. Detta gäller till exempel för rutiner som gör asynkrona metodanrop. I sådana scenarier kan du använda kompletterande System.Memory<T> och System.ReadOnlyMemory<T> typer.

För intervall som representerar oföränderliga eller skrivskyddade strukturer använder du System.ReadOnlySpan<T>.

Memory

A Span<T> representerar en sammanhängande region med godtyckligt minne. En Span<T> instans används ofta för att lagra elementen i en matris eller en del av en matris. Till skillnad från en matris kan dock en Span<T> instans peka på hanterat minne, inbyggt minne eller minne som hanteras på stacken. I följande exempel skapas en Span<Byte> från en matris:

// Create a span over an array.
var array = new byte[100];
var arraySpan = new Span<byte>(array);

byte data = 0;
for (int ctr = 0; ctr < arraySpan.Length; ctr++)
    arraySpan[ctr] = data++;

int arraySum = 0;
foreach (var value in array)
    arraySum += value;

Console.WriteLine($"The sum is {arraySum}");
// Output:  The sum is 4950
// Create a span over an array.
let array = Array.zeroCreate<byte> 100
let arraySpan = Span<byte> array

let mutable data = 0uy
for i = 0 to arraySpan.Length - 1 do
    arraySpan[i] <- data
    data <- data + 1uy

let mutable arraySum = 0
for value in array do
    arraySum <- arraySum + int value

printfn $"The sum is {arraySum}"
// Output:  The sum is 4950

I följande exempel skapas en Span<Byte> med 100 byte ursprungligt minne:

// Create a span from native memory.
var native = Marshal.AllocHGlobal(100);
Span<byte> nativeSpan;
unsafe
{
    nativeSpan = new Span<byte>(native.ToPointer(), 100);
}
byte data = 0;
for (int ctr = 0; ctr < nativeSpan.Length; ctr++)
    nativeSpan[ctr] = data++;

int nativeSum = 0;
foreach (var value in nativeSpan)
    nativeSum += value;

Console.WriteLine($"The sum is {nativeSum}");
Marshal.FreeHGlobal(native);
// Output:  The sum is 4950
// Create a span from native memory.
let native = Marshal.AllocHGlobal 100
let nativeSpan = Span<byte>(native.ToPointer(), 100)

let mutable data = 0uy
for i = 0 to nativeSpan.Length - 1 do
    nativeSpan[i] <- data
    data <- data + 1uy

let mutable nativeSum = 0
for value in nativeSpan do
    nativeSum <- nativeSum + int value

printfn $"The sum is {nativeSum}"
Marshal.FreeHGlobal native
// Output:  The sum is 4950

I följande exempel används nyckelordet C# stackalloc för att allokera 100 byte minne på stacken:

// Create a span on the stack.
byte data = 0;
Span<byte> stackSpan = stackalloc byte[100];
for (int ctr = 0; ctr < stackSpan.Length; ctr++)
    stackSpan[ctr] = data++;

int stackSum = 0;
foreach (var value in stackSpan)
    stackSum += value;

Console.WriteLine($"The sum is {stackSum}");
// Output:  The sum is 4950
    // Create a span on the stack.
    let mutable data = 0uy
    let stackSpan = 
        let p = NativeInterop.NativePtr.stackalloc<byte> 100 |> NativeInterop.NativePtr.toVoidPtr
        Span<byte>(p, 100)

    for i = 0 to stackSpan.Length - 1 do
        stackSpan[i] <- data
        data <- data + 1uy

    let mutable stackSum = 0
    for value in stackSpan do
        stackSum <- stackSum + int value

    printfn $"The sum is {stackSum}"
// Output:  The sum is 4950

Eftersom Span<T> är en abstraktion över ett godtyckligt minnesblock fungerar metoder av typen Span<T> och metoderna med Span<T> parametrar på alla Span<T> objekt oavsett vilken typ av minne det kapslar in. Till exempel kan var och en av de separata kodavsnitten som initierar intervallet och beräknar summan av dess element omstruktureras till enkla initierings- och beräkningsmetoder, vilket visas i följande exempel:

public static void WorkWithSpans()
{
    // Create a span over an array.
    var array = new byte[100];
    var arraySpan = new Span<byte>(array);

    InitializeSpan(arraySpan);
    Console.WriteLine($"The sum is {ComputeSum(arraySpan):N0}");

    // Create an array from native memory.
    var native = Marshal.AllocHGlobal(100);
    Span<byte> nativeSpan;
    unsafe
    {
        nativeSpan = new Span<byte>(native.ToPointer(), 100);
    }

    InitializeSpan(nativeSpan);
    Console.WriteLine($"The sum is {ComputeSum(nativeSpan):N0}");

    Marshal.FreeHGlobal(native);

    // Create a span on the stack.
    Span<byte> stackSpan = stackalloc byte[100];

    InitializeSpan(stackSpan);
    Console.WriteLine($"The sum is {ComputeSum(stackSpan):N0}");
}

public static void InitializeSpan(Span<byte> span)
{
    byte value = 0;
    for (int ctr = 0; ctr < span.Length; ctr++)
        span[ctr] = value++;
}

public static int ComputeSum(Span<byte> span)
{
    int sum = 0;
    foreach (var value in span)
        sum += value;

    return sum;
}
// The example displays the following output:
//    The sum is 4,950
//    The sum is 4,950
//    The sum is 4,950
open System
open System.Runtime.InteropServices
open FSharp.NativeInterop

// Package FSharp.NativeInterop.NativePtr.stackalloc for reuse.
let inline stackalloc<'a when 'a: unmanaged> length : Span<'a> =
    let voidPointer = NativePtr.stackalloc<'a> length |> NativePtr.toVoidPtr
    Span<'a>(voidPointer, length)

let initializeSpan (span: Span<byte>) =
    let mutable value = 0uy
    for i = 0 to span.Length - 1 do
        span[i] <- value
        value <- value + 1uy

let computeSum (span: Span<byte>) =
    let mutable sum = 0
    for value in span do
        sum <- sum + int value
    sum

let workWithSpans () =
    // Create a span over an array.
    let array = Array.zeroCreate<byte> 100
    let arraySpan = Span<byte> array

    initializeSpan arraySpan
    printfn $"The sum is {computeSum arraySpan:N0}"

    // Create an array from native memory.
    let native = Marshal.AllocHGlobal 100
    let nativeSpan = Span<byte>(native.ToPointer(), 100)

    initializeSpan nativeSpan
    printfn $"The sum is {computeSum nativeSpan:N0}"

    Marshal.FreeHGlobal native

    // Create a span on the stack.
    let stackSpan = stackalloc 100

    initializeSpan stackSpan
    printfn $"The sum is {computeSum stackSpan:N0}"

// The example displays the following output:
//    The sum is 4,950
//    The sum is 4,950
//    The sum is 4,950

Array

När Span<T> omsluter en matris kan den omsluta en hel matris, precis som i exemplen i avsnittet Minne. Eftersom den stöder segmentering Span<T> kan den även peka på valfritt sammanhängande intervall i matrisen.

I följande exempel skapas en sektor med de fem mellersta elementen i en heltalsmatris med 10 element. Observera att koden fördubblar värdena för varje heltal i slicen. Som utdata visar återspeglas de ändringar som gjorts av intervallet i matrisens värden.

using System;

var array = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
var slice = new Span<int>(array, 2, 5);
for (int ctr = 0; ctr < slice.Length; ctr++)
    slice[ctr] *= 2;

// Examine the original array values.
foreach (var value in array)
    Console.Write($"{value}  ");
Console.WriteLine();

// The example displays the following output:
//      2  4  12  16  20  24  28  16  18  20
module Program

open System

[<EntryPoint>]
let main _ =
    let array = [| 2; 4; 6; 8; 10; 12; 14; 16; 18; 20 |]
    let slice = Span<int>(array, 2, 5)
    for i = 0 to slice.Length - 1 do
        slice[i] <- slice[i] * 2

    // Examine the original array values.
    for value in array do
        printf $"{value}  "
    printfn ""
    0
// The example displays the following output:
//      2  4  12  16  20  24  28  16  18  20

Segment

Span<T> innehåller två överlagringar av metoden Slice som utgör ett segment av det aktuella intervallet som börjar vid ett angivet index. Detta gör det möjligt att behandla data i en Span<T> som en uppsättning logiska segment som kan bearbetas efter behov av delar av en databearbetningspipeline med minimal prestandapåverkan. Eftersom moderna serverprotokoll ofta är textbaserade är manipulering av strängar och understrängar särskilt viktigt. I klassen String är Substring huvudmetoden för att extrahera delsträngar. För datapipelines som är beroende av omfattande strängmanipulering ger användningen vissa prestandapåföljder eftersom den:

  1. Skapar en ny sträng som ska innehålla delsträngen.
  2. Kopierar en delmängd av tecknen från den ursprungliga strängen till den nya strängen.

Den här allokerings- och kopieringsåtgärden kan elimineras med antingen Span<T> eller ReadOnlySpan<T>, som följande exempel visar:

using System;

class Program2
{
    static void Run()
    {
        string contentLength = "Content-Length: 132";
        var length = GetContentLength(contentLength.ToCharArray());
        Console.WriteLine($"Content length: {length}");
    }

    private static int GetContentLength(ReadOnlySpan<char> span)
    {
        var slice = span.Slice(16);
        return int.Parse(slice);
    }
}
// Output:
//      Content length: 132
module Program2

open System

let getContentLength (span: ReadOnlySpan<char>) =
    let slice = span.Slice 16
    Int32.Parse slice

let contentLength = "Content-Length: 132"
let length = getContentLength (contentLength.ToCharArray())
printfn $"Content length: {length}"
// Output:
//      Content length: 132

Konstruktorer

Name Description
Span<T>(T)

Skapar en ny Span<T> längd 1 runt den angivna referensen.

Span<T>(T[], Int32, Int32)

Skapar ett nytt Span<T> objekt som innehåller ett angivet antal element i en matris med början vid ett angivet index.

Span<T>(T[])

Skapar ett nytt Span<T> objekt över hela en angiven matris.

Span<T>(Void*, Int32)

Skapar ett nytt Span<T> objekt från ett angivet antal T element som börjar på en angiven minnesadress.

Egenskaper

Name Description
Empty

Returnerar ett tomt Span<T> objekt.

IsEmpty

Returnerar ett värde som anger om den aktuella är Span<T> tom.

Item[Int32]

Hämtar elementet vid det angivna nollbaserade indexet.

Length

Returnerar längden på det aktuella intervallet.

Metoder

Name Description
Clear()

Rensar innehållet i det här Span<T> objektet.

CopyTo(Span<T>)

Kopierar innehållet i detta Span<T> till ett mål Span<T>.

Equals(Object)
Föråldrad.
Föråldrad.

Anrop till den här metoden stöds inte.

Fill(T)

Fyller elementen i det här intervallet med ett angivet värde.

GetEnumerator()

Returnerar en uppräknare för den här Span<T>.

GetHashCode()
Föråldrad.

Kastar en NotSupportedException.

GetPinnableReference()

Returnerar en referens till ett objekt av typen T som kan användas för att fästa.

Den här metoden är avsedd att stödja .NET kompilatorer och är inte avsedd att anropas av användarkod.

Slice(Int32, Int32)

Bildar ett segment från det aktuella intervallet som börjar vid ett angivet index för en angiven längd.

Slice(Int32)

Bildar ett segment av det aktuella intervallet som börjar vid ett angivet index.

ToArray()

Kopierar innehållet i det här intervallet till en ny matris.

ToString()

Returnerar strängrepresentationen av det här Span<T> objektet.

TryCopyTo(Span<T>)

Försöker kopiera den aktuella Span<T> till ett mål Span<T> och returnerar ett värde som anger om kopieringsåtgärden lyckades.

Operatorer

Name Description
Equality(Span<T>, Span<T>)

Returnerar ett värde som anger om två Span<T> objekt är lika med.

Implicit(ArraySegment<T> to Span<T>)

Definierar en implicit konvertering av en ArraySegment<T> till en Span<T>.

Implicit(Span<T> to ReadOnlySpan<T>)

Definierar en implicit konvertering av en Span<T> till en ReadOnlySpan<T>.

Implicit(T[] to Span<T>)

Definierar en implicit konvertering av en matris till en Span<T>.

Inequality(Span<T>, Span<T>)

Returnerar ett värde som anger om två Span<T> objekt inte är lika med.

Tilläggsmetoder

Name Description
BinarySearch<T,TComparable>(Span<T>, TComparable)

Söker igenom en hel sorterad Span<T> efter ett värde med den angivna TComparable generiska typen.

BinarySearch<T,TComparer>(Span<T>, T, TComparer)

Söker igenom en hel sorterad Span<T> efter ett angivet värde med den angivna TComparer generiska typen.

BinarySearch<T>(Span<T>, IComparable<T>)

Söker igenom en hel sorterad Span<T> efter ett värde med det angivna IComparable<T> allmänna gränssnittet.

CommonPrefixLength<T>(Span<T>, ReadOnlySpan<T>, IEqualityComparer<T>)

Hittar längden på alla vanliga prefix som delas mellan span och other.

CommonPrefixLength<T>(Span<T>, ReadOnlySpan<T>)

Hittar längden på alla vanliga prefix som delas mellan span och other.

Contains<T>(Span<T>, T)

Anger om ett angivet värde finns i ett intervall.

ContainsAny<T>(Span<T>, ReadOnlySpan<T>)

Söker efter en förekomst av någon av de angivna values och returnerar true om det hittas. Om det inte hittas returnerar false.

ContainsAny<T>(Span<T>, SearchValues<T>)

Söker efter en förekomst av någon av de angivna values och returnerar true om det hittas. Om det inte hittas returnerar false.

ContainsAny<T>(Span<T>, T, T, T)

Söker efter en förekomst av value0, value1eller value2 i det angivna intervallet.

ContainsAny<T>(Span<T>, T, T)

Söker efter en förekomst av value0 eller value1, och returnerar true om det hittas. Om det inte hittas returnerar false.

ContainsAnyExcept<T>(Span<T>, ReadOnlySpan<T>)

Söker i det angivna intervallet efter ett annat värde än det angivna values.

ContainsAnyExcept<T>(Span<T>, SearchValues<T>)

Söker i det angivna intervallet efter ett annat värde än det angivna values.

ContainsAnyExcept<T>(Span<T>, T, T, T)

Söker efter ett annat värde än value0, value1eller value2.

ContainsAnyExcept<T>(Span<T>, T, T)

Söker i det angivna intervallet efter andra värden än value0 eller value1.

ContainsAnyExcept<T>(Span<T>, T)

Söker i det angivna intervallet efter ett annat värde än det angivna value.

ContainsAnyExceptInRange<T>(Span<T>, T, T)

Söker efter valfritt värde utanför intervallet mellan lowInclusive och highInclusive, inklusive.

ContainsAnyInRange<T>(Span<T>, T, T)

Söker efter valfritt värde i intervallet mellan lowInclusive och highInclusive, inklusive och returnerar true om det hittas. Om det inte hittas returnerar false.

Count<T>(Span<T>, ReadOnlySpan<T>)

Räknar antalet gånger som anges value inträffar i span.

Count<T>(Span<T>, T)

Räknar antalet gånger som anges value inträffar i span.

EndsWith<T>(Span<T>, ReadOnlySpan<T>)

Avgör om den angivna sekvensen visas i slutet av ett intervall.

IndexOf<T>(Span<T>, ReadOnlySpan<T>)

Söker efter den angivna sekvensen och returnerar indexet för den första förekomsten.

IndexOf<T>(Span<T>, T)

Söker efter det angivna värdet och returnerar indexet för dess första förekomst.

IndexOfAny<T>(Span<T>, ReadOnlySpan<T>)

Söker efter det första indexet för något av de angivna värdena.

IndexOfAny<T>(Span<T>, SearchValues<T>)

Söker efter det första indexet för något av de angivna värdena.

IndexOfAny<T>(Span<T>, T, T, T)

Söker efter det första indexet för något av de angivna värdena.

IndexOfAny<T>(Span<T>, T, T)

Söker efter det första indexet för något av de angivna värdena.

IndexOfAnyExcept<T>(Span<T>, ReadOnlySpan<T>)

Söker efter det första indexet för något annat värde än det angivna values.

IndexOfAnyExcept<T>(Span<T>, SearchValues<T>)

Söker efter det första indexet för något annat värde än det angivna values.

IndexOfAnyExcept<T>(Span<T>, T, T, T)

Söker efter det första indexet för något annat värde än value0, value1eller value2.

IndexOfAnyExcept<T>(Span<T>, T, T)

Söker efter det första indexet för något annat värde än de två angivna värdena.

IndexOfAnyExcept<T>(Span<T>, T)

Söker efter det första indexet för något annat värde än det angivna value.

IndexOfAnyExceptInRange<T>(Span<T>, T, T)

Söker efter det första indexet för ett värde utanför intervallet mellan lowInclusive och highInclusive, inklusive.

IndexOfAnyInRange<T>(Span<T>, T, T)

Söker efter det första indexet för ett värde i intervallet mellan lowInclusive och highInclusive, inklusive.

LastIndexOf<T>(Span<T>, ReadOnlySpan<T>)

Söker efter den angivna sekvensen och returnerar indexet för den senaste förekomsten.

LastIndexOf<T>(Span<T>, T)

Söker efter det angivna värdet och returnerar indexet för dess senaste förekomst.

LastIndexOfAny<T>(Span<T>, ReadOnlySpan<T>)

Söker efter det sista indexet för något av de angivna värdena.

LastIndexOfAny<T>(Span<T>, SearchValues<T>)

Söker efter det sista indexet för något av de angivna värdena.

LastIndexOfAny<T>(Span<T>, T, T, T)

Söker efter det sista indexet för något av de angivna värdena.

LastIndexOfAny<T>(Span<T>, T, T)

Söker efter det sista indexet för något av de angivna värdena.

LastIndexOfAnyExcept<T>(Span<T>, ReadOnlySpan<T>)

Söker efter det sista indexet för något annat värde än det angivna values.

LastIndexOfAnyExcept<T>(Span<T>, SearchValues<T>)

Söker efter det sista indexet för något annat värde än det angivna values.

LastIndexOfAnyExcept<T>(Span<T>, T, T, T)

Söker efter det sista indexet för något annat värde än det angivna value0, value1eller value2.

LastIndexOfAnyExcept<T>(Span<T>, T, T)

Söker efter det sista indexet för något annat värde än det angivna value0 eller value1.

LastIndexOfAnyExcept<T>(Span<T>, T)

Söker efter det sista indexet för något annat värde än det angivna value.

LastIndexOfAnyExceptInRange<T>(Span<T>, T, T)

Söker efter det sista indexet för ett värde utanför intervallet mellan lowInclusive och highInclusive, inklusive.

LastIndexOfAnyInRange<T>(Span<T>, T, T)

Söker efter det sista indexet för ett värde i intervallet mellan lowInclusive och highInclusive, inklusive.

Overlaps<T>(Span<T>, ReadOnlySpan<T>, Int32)

Avgör om ett spann och ett skrivskyddat intervall överlappar i minnet och matar ut elementförskjutningen.

Overlaps<T>(Span<T>, ReadOnlySpan<T>)

Avgör om ett spann och ett skrivskyddat intervall överlappar i minnet.

Replace<T>(Span<T>, T, T, IEqualityComparer<T>)

Ersätter alla förekomster av oldValue med newValue.

Replace<T>(Span<T>, T, T)

Ersätter alla förekomster av oldValue med newValue.

ReplaceAny<T>(Span<T>, SearchValues<T>, T)

Ersätter i span alla förekomster av något av elementen i values med newValue.

ReplaceAnyExcept<T>(Span<T>, SearchValues<T>, T)

Ersätter i span alla element, förutom de i values, med newValue.

Reverse<T>(Span<T>)

Ändrar sekvensen för elementen i hela intervallet.

SequenceCompareTo<T>(Span<T>, ReadOnlySpan<T>)

Avgör den relativa ordningen för ett spann och ett skrivskyddat intervall genom att jämföra elementen med IComparable{T}. CompareTo(T).

SequenceEqual<T>(Span<T>, ReadOnlySpan<T>, IEqualityComparer<T>)

Avgör om två sekvenser är lika med genom att jämföra elementen med hjälp av en IEqualityComparer<T>.

SequenceEqual<T>(Span<T>, ReadOnlySpan<T>)

Avgör om ett spann och ett skrivskyddat intervall är lika med genom att jämföra elementen med IEquatable{T}. Lika med(T).

Sort<T,TComparer>(Span<T>, TComparer)

Sorterar elementen i hela Span<T> med hjälp av TComparer.

Sort<T>(Span<T>, Comparison<T>)

Sorterar elementen i hela Span<T> med den angivna Comparison<T>.

Sort<T>(Span<T>)

Sorterar elementen i hela Span<T> med implementeringen IComparable<T> av varje element i Span<T>.

Sort<TKey,TValue,TComparer>(Span<TKey>, Span<TValue>, TComparer)

Sorterar ett par intervall (ett som innehåller nycklarna och det andra som innehåller motsvarande objekt) baserat på nycklarna i den första Span<T> med hjälp av den angivna jämförelsen.

Sort<TKey,TValue>(Span<TKey>, Span<TValue>, Comparison<TKey>)

Sorterar ett par intervall (ett som innehåller nycklarna och det andra som innehåller motsvarande objekt) baserat på nycklarna i den första Span<T> med hjälp av den angivna jämförelsen.

Sort<TKey,TValue>(Span<TKey>, Span<TValue>)

Sorterar ett par intervall (ett som innehåller nycklarna och det andra som innehåller motsvarande objekt) baserat på nycklarna i den första Span<T> med implementeringen IComparable<T> av varje nyckel.

StartsWith<T>(Span<T>, ReadOnlySpan<T>)

Avgör om en angiven sekvens visas i början av ett intervall.

ToImmutableArray<T>(Span<T>)

Konverterar intervallet till en oföränderlig matris.

Trim<T>(Span<T>, ReadOnlySpan<T>)

Tar bort alla inledande och avslutande förekomster av en uppsättning element som anges i ett skrivskyddat intervall från ett intervall.

Trim<T>(Span<T>, T)

Tar bort alla inledande och avslutande förekomster av ett angivet element från ett spann.

TrimEnd<T>(Span<T>, ReadOnlySpan<T>)

Tar bort alla avslutande förekomster av en uppsättning element som anges i ett skrivskyddat intervall från ett intervall.

TrimEnd<T>(Span<T>, T)

Tar bort alla avslutande förekomster av ett angivet element från ett intervall.

TrimStart<T>(Span<T>, ReadOnlySpan<T>)

Tar bort alla inledande förekomster av en uppsättning element som anges i ett skrivskyddat intervall från intervallet.

TrimStart<T>(Span<T>, T)

Tar bort alla inledande förekomster av ett angivet element från intervallet.

Gäller för

Se även