IRONSOFTWAREHOME
AKTUALNOŚCI DLA PROGRAMISTÓW

C# Span (jak to działa dla programistów)

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Jacob Mellor
Updated: 23 kwietnia 2026

Span to typ wprowadzony w C# 7.2 jako część struktury Span w przestrzeni nazw System. Jest zaprojektowany do reprezentowania ciaglego obszaru dowolnej pamięci. W przeciwienstwie do tablic lub kolekcji takich jak zarzadzany stos, Span nie jest właścicielem pamięci stosu ani regionu pamięci, do którego wskazuje; zamiast tego oferuje lekki widok nad istniejącymi blokami pamięci. Ta cecha czyni Span szczególnie potężnym w scenariuszach, gdzie należy pracować z buforami pamięci efektywnie, bez generowania dodatkowych kosztów i ryzyk związanych z niebezpiecznym kodem. Pozniej w artykułe zapoznamy sie równiez z biblioteka IronPDF od Iron Software.

Kluczowe cechy Span

1. Zarządzanie pamięcią

Span w C# pozwala programistom na bezpośrednia prace z pamięcią, bez korzystania z tradycyjnych alokacji na stosie. Oferuje sposób na tworzenie wycinków pamięci z istniejących tablic lub innych źródeł pamięci, eliminując potrzebę dodatkowego kopiowania pamięci.

2. Abstrakcje zero-kopiowania

Jedna z wyróżniąjacych sie funkcji C# Span jest jego abstrahowanie bez kopiowania. Zamiast duplikowac dane, Span udostępnia sposób efektywnego odniesienia się do istniejącej pamięci. Jest to szczególnie korzystne w scenariuszach, gdy kopiowanie dużych ilości danych byłoby niepraktyczne lub zbyt kosztowne.

3. Operacje podobne do wskaźników

Mimo że C# tradycyjnie jest językiem wysokopoziomowym i bezpiecznym, Span wprowadza pewien stopień niskopoziomowej manipulacji pamięcią, podobny do pracy ze wskaźnikami w językach takich jak C czy C++. Programiści mogą wykonywać operacje podobne do wskaźników, nie poświęcając bezpieczeństwa i zarządzanego charakteru C#.

4. Niezmiennosc

Pomimo swoich możliwości dostępu do pamięci niskopoziomowej, C# Span pozostaje niezmienny. Oznacza to, że chociaż pozwala na manipulację pamięcią, wymusza bezpieczeństwo poprzez zapobieganie niezamierzonym modyfikacjom.

Przykład

using System;

class Program
{
    static void Main()
    {
        int[] array = { 1, 2, 3, 4, 5 };

        // Create a span that points to the entire array
        Span<int> span = array;

        // Modify the data using the span
        span[2] = 10;

        // Print the modified array
        foreach (var item in array)
        {
            Console.WriteLine(item);
        }
    }
}

ReadOnlySpan

Podczas gdy Span jest zmienny i pozwala na modyfikacje danych bazowych, ReadOnlySpan jest niezmiennym widokiem pamięci. Udostępnia interfejs tylko do odczytu dla ciągłego obszaru pamięci, co czyni go odpowiednim w scenariuszach, gdzie potrzebujesz jedynie odczytać dane, nie modyfikując ich.

Oto kilka kluczowych punktów.

1. Widok tylko do odczytu

Jak sama nazwa wskazuje, ReadOnlySpan pozwala na utworzenie tylko do odczytu widoku bloku pamięci. Oznacza to, że nie można modyfikować elementów przez ReadOnlySpan.

2. Reprezentacja pamięci

Podobnie jak Span, ReadOnlySpan nie jest właścicielem pamięci, na którą wskazuje. Odnosi się do istniejącej pamięci i może wskazywać na tablice, pamięć stosową lub pamięć natywną.

3. Korzyści wydajnościowe

Jak Span, ReadOnlySpan może oferować lepszą wydajność w porównaniu do tradycyjnych typów kolekcji, szczególnie przy przetwarzaniu dużej ilości danych, gdyż redukuje potrzebę kopiowania.

4. Brak sprawdzania granic

Podobnie jak w przypadku Span, ReadOnlySpan nie przeprowadza sprawdzania granic. To na programiście leży odpowiedzialność za zapewnienie, że operacje pozostają w granicach pamięci, na której działają.

5. Użycie z wycinkami tablic

ReadOnlySpan wspiera tworzenie fragmentów, umożliwiając utworzenie pod-spanów, które odnoszą się do części oryginalnej pamięci.

Przykład

using System;

class Program
{
    static void Main()
    {
        int[] array = { 1, 2, 3, 4, 5 };

        // Create a read-only span that points to the entire array
        ReadOnlySpan<int> readOnlySpan = array;

        // Access and print the data through the read-only span
        foreach (var item in readOnlySpan)
        {
            Console.WriteLine(item);
        }

        // Note: The following line would result in a compilation error since readOnlySpan is read-only.
        // readOnlySpan[2] = 10;
    }
}

Istnieje wiele różnych sposobów na tworzenie ReadOnlySpan i pracę z nim. Poniżej znajdują się przykłady.

1. Tworzenie ReadOnlySpan ze String

string msg = "Hello, World!";
ReadOnlySpan<char> span1 = msg.AsSpan();
// Read-only manipulation
char firstChar = span1[0];
Console.WriteLine(firstChar); // Outputs: H

2. Praca z podciagami

Użyj Slice na ReadOnlySpan<char>

// Example usage of Slice method on ReadOnlySpan<char>
ReadOnlySpan<char> spanFromString = "Sample String".AsSpan();
ReadOnlySpan<char> substringSpan = spanFromString.Slice(7, 6); // Extracts 'String'

3. Przekazywanie podciągu do metody

Przekaż ReadOnlySpan<char> jako parametr do metody.

void ProcessSubstringfromReadOnlySpan(ReadOnlySpan<char> substring)
{
    // Perform operations on the substring
}

// Usage
ReadOnlySpan<char> spanFromString = "Sample String".AsSpan();
ProcessSubstringfromReadOnlySpan(spanFromString.Slice(7, 6));

4. Wyszukiwanie w String

ReadOnlySpan<char> do wyszukiwania wewnątrz ciągu za pomocą IndexOf().

ReadOnlySpan<char> stringSpan = "Hello, World!".AsSpan();
int index = stringSpan.IndexOf('W');
Console.WriteLine(index); // Outputs: 7

5. Użycie z plikami mapowanymi w pamięci

ReadOnlySpan<char> może być bardziej efektywny z plikami mapowanymi w pamięci.

using System;
using System.IO.MemoryMappedFiles;

class Program
{
    static void ProcessData(ReadOnlySpan<byte> data)
    {
        // Process data directly from the memory-mapped file
    }

    static void Main()
    {
        using (var memmf = MemoryMappedFile.CreateFromFile("data.bin"))
        {
            using (var accessor = memmf.CreateViewAccessor())
            {
                byte[] buffer = new byte[accessor.Capacity];
                accessor.ReadArray(0, buffer, 0, buffer.Length);

                ReadOnlySpan<byte> dataSpan = new ReadOnlySpan<byte>(buffer);
                ProcessData(dataSpan);
            }
        }
    }
}

6. Efektywna manipulacja napisami

ReadOnlySpan<char> może być używany do efektywnej manipulacji napisami.

Span<char> newSpan = new char[6];
ReadOnlySpan<char> spanFromString = "Sample String".AsSpan().Slice(7, 6);
spanFromString.CopyTo(newSpan);
Console.WriteLine(new string(newSpan)); // Outputs: String

7. Przekazywanie podciągu do interfejsów API

Podczas pracy z zewnętrznymi bibliotekami lub API, które operują na rozpiętościach znaków.

void ExternalApiMethod(ReadOnlySpan<char> data)
{
    // Call the external API with the character span
}

// Usage
ReadOnlySpan<char> spanFromString = "Sample String".AsSpan();
ExternalApiMethod(spanFromString.Slice(7, 6));

ReadOnlySpan<char> zapewnia sposób na bardziej efektywną pracę z napisami, szczególnie w scenariuszach, gdy alokacje pamięci i kopiowanie powinny być zminimalizowane. Jest to potężne narzędzie do optymalizacji kodu krytycznego dla wydajności i może być szczególnie korzystne przy pracy z dużymi ilościami danych napisowych.

Ograniczenia Span

Chociaż Span w C# to potężna funkcja z licznymi zaletami, wiąże się z pewnymi ograniczeniami i uwagami, szczególnie w kontekście pamięci ciągłej i nieciągłej. Przyjrzyjmy się tym ograniczeniom:

1. Bufory pamięci ciągłej

1.1 Brak automatycznego zarządzania pamięcią

Span nie zarządza pamięcią, na którą wskazuje. Oznacza to, że jeśli zarządzana pamięć bazowa zostanie zwolniona lub wyjdzie poza zakres, użycie Span spowoduje nieokreślone zachowanie lub potencjalne awarie. Deweloperzy muszą upewnić się, że pamięć bazowa jest wciąż ważna podczas używania Span.

1.2 Brak zbierania śmieći

Ponieważ Span nie jest właścicielem pamięci, nie podlega zbieraniu śmieci. Dlatego należy zachować ostrożność przy pracy z pamięcią przydzieloną na stosie lub pamięcią, która ma krótszy czas życia niż sam Span.

1.3 Wyłączenie sprawdzania granic

Span i ReadOnlySpan domyślnie nie przeprowadzają sprawdzania granic. Może to prowadzić do dostępu do niepoprawnych lokalizacji pamięci, jeśli używane są nieostrożnie. Deweloperzy muszą ręcznie upewnić się, że operacje na Span mieszczą się w granicach pamięci bazowej.

1.4 Brak wsparcia dla pamięci nieciągłej

Span jest zaprojektowany do pracy z ciągłą pamięcią. Jeśli posiadasz nieciągłą pamięć lub potrzebujesz reprezentować bardziej złożone struktury danych, Span może nie być najodpowiedniejszym wyborem.

1.5 Nie wszystkie operacje są wspierane

Chociaż Span wspiera wiele wspólnych operacji jak tworzenie fragmentów, indeksowanie i iterowanie, nie wszystkie operacje są wspierane. Na przykład, nie można zmienić rozmiaru Span oraz niektóre operacje związane ze zmianą długości pamięci bazowej nie są dozwolone.

1.6 Ograniczona kompatybilność platformowa

Chociaż Span jest częścią .NET Standard i .NET Core, może nie być dostępny na wszystkich platformach lub w środowiskach. Niezmiernie ważne jest, aby upewnić się, że docelowa platforma wspiera Span, jeśli planujesz użyć go w swoim kodzie.

2. Bufory pamięci nieciągłej

2.1 Ograniczona obsługa pamięci nieciągłej

ReadOnlySpan jest głównie zaprojektowany do bezproblemowej pracy z ciągłymi blokami pamięci lub buforami. Może nie być najbardziej odpowiednim wyborem w scenariuszach, gdzie występują bufory pamięci nieciągłej lub struktury z lukami w pamięci.

2.2 Ograniczenia strukturalne

Pewne struktury danych lub scenariusze, które polegają na nieciągłej pamięci, mogą nie odpowiadać dobrze z ReadOnlySpan. Na przykład, takie struktury danych jak listy połączone lub struktury grafowe mogą nie być dobrze dostosowane z powodu wymogu ciągłej pamięci w ReadOnlySpan.

2.3 Złożone operacje na wskaźnikach

W sytuacjach obejmujących nieciągłą pamięć, szczególnie tych wymagających złożonej arytmetyki wskaźników, ReadOnlySpan może nie oferować tego samego niskopoziomowego kontrolowania i elastyczności co surowe wskaźniki w językach takich jak C++. W takich przypadkach korzystanie z niebezpiecznego kodu ze wskaźnikami może być bardziej odpowiednie.

2.4 Brak bezpośredniego wsparcia w niektórych API

Podobnie jak w przypadku ciągłej pamięci, warto zauważyć, że nie wszystkie API lub biblioteki mogą bezpośrednio wspierać nieciągłą pamięć reprezentowaną przez ReadOnlySpan. Dostosowanie się do takich scenariuszy może wymagać dodatkowych kroków pośrednich lub konwersji w celu zapewnienia kompatybilności.

Span i pamięć niezarzadzana

W C# Span może być skutecznie wykorzystywany z pamięcią niezarzadzana do przeprowadzania operacji związanych z pamięcią w kontrolowany i efektywny sposób. Pamieć niezarzadzana odnosi sie do pamięci, która nie jest zarzadzana przez zbieracza smieći w czasie trwania .NET, i często wiąże się z użyciem natywnych alokacji i dealokacji pamięci. Oto jak Span może być stosowany z pamięcią niezarządzaną w C#.

Alokowanie pamięci niezarzadzanej

Aby przeprowadzić alokację pamięci niezarządzanej, można użyć klasy System.Runtime.InteropServices.MemoryMarshal. Metoda Marshal.AllocHGlobal alokuje pamięć i zwraca wskaźnik na przydzielony blok. Przydzielona pamięć lub adres pamięci jest przechowywany we wskaźniku unmanagedMemory i będzie mieć dostep odczyt-zapis. Ciągłe obszary pamięci można łatwo uzyskać.

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        const int bufferSize = 100;
        IntPtr unmanagedMemory = Marshal.AllocHGlobal(bufferSize);

        // Create a Span from the unmanaged memory
        Span<byte> span = new Span<byte>(unmanagedMemory.ToPointer(), bufferSize);

        // Use the Span as needed...
        
        // Don't forget to free the unmanaged memory when done
        Marshal.FreeHGlobal(unmanagedMemory);
    }
}

W powyższym kodzie źródłowym przydzielamy blok niezarządzanej pamięci przy użyciu Marshal.AllocHGlobal, a następnie tworzymy Span<byte> używając wskaźnika uzyskanego z niezarządzanej pamięci. Pozwala nam to pracować z pamięcią niezarządzaną, korzystając z dobrze znanego API Span. Ważne jest zauważenie, że podczas pracy z pamięcią niezarządzaną, odpowiadasz za zarządzanie alokacją i dealokacją pamięci.

Kopiowanie danych do i z pamięci niezarzadzanej

Span oferuje metody takie jak Slice, CopyTo oraz ToArray, które mogą być używane do efektywnego kopiowania danych między zarządzaną a niezarządzaną pamięcią.

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        // Managed array to copy data from
        int[] sourceArray = { 1, 2, 3, 4, 5 };
        
        // Allocate unmanaged memory for the destination data
        IntPtr destinationPointer = Marshal.AllocHGlobal(sourceArray.Length * sizeof(int));
        try
        {
            // Create a Span<int> from the source array
            Span<int> sourceSpan = sourceArray;
            
            // Create a Span<int> from the allocated unmanaged memory
            Span<int> destinationSpan = new Span<int>(destinationPointer.ToPointer(), sourceArray.Length);
            
            // Copy data from the source Span<int> to the destination Span<int>
            sourceSpan.CopyTo(destinationSpan);
            
            // Print the values in the destination memory
            Console.WriteLine("Values in the destination memory:");
            foreach (var value in destinationSpan)
            {
                Console.Write($"{value} ");
            }
        }
        finally
        {
            // Deallocate the unmanaged memory when done
            Marshal.FreeHGlobal(destinationPointer);
        }
    }
}

W tym przykładzie:

  • Marshal.AllocHGlobal przydziela niezarządzaną pamięć dla danych docelowych.
  • new Span<int>(destinationPointer.ToPointer(), sourceArray.Length) tworzy Span<int> z przydzielonej niezarządzanej pamięci.
  • Metoda sourceSpan.CopyTo(destinationSpan) kopiuje dane z zarządzanej tablicy do niezarządzanej pamięci.
  • Wartości w pamięci docelowej są drukowane w celu weryfikacji operacji kopiowania.
  • Metoda Marshal.FreeHGlobal(destinationPointer) jest używana do zwalniania niezarządzanej pamięci po zakończeniu.

Korzystanie z kodu niebezpiecznego

Podczas pracy z pamięcią niezarządzaną możesz również użyć kodu niebezpiecznego z wskaźnikami. W takich przypadkach możesz uzyskać wskaźnik z Span, używając metody Unsafe.AsPointer().

using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

class Program
{
    static void Main()
    {
        const int bufferSize = 100;
        IntPtr unmanagedMemory = Marshal.AllocHGlobal(bufferSize);

        // Create a Span from the unmanaged memory
        Span<byte> span = new Span<byte>(unmanagedMemory.ToPointer(), bufferSize);

        // Use unsafe code to work with pointers
        unsafe
        {
            byte* pointer = (byte*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(span));
            // Use the pointer as needed...
        }

        // Don't forget to free the unmanaged memory when done
        Marshal.FreeHGlobal(unmanagedMemory);
    }
}

W tym przykładzie używamy metody Unsafe.AsPointer, aby uzyskać wskaźnik z Span. Pozwala to na użycie kodu niebezpiecznego przy bezpośredniej pracy ze wskaźnikami.

Pamiętaj, że podczas pracy z pamięcią niezarządzaną kluczowe jest prawidłowe zarządzanie alokacjami i dealokacjami, aby uniknąć wycieków pamięci. Zawsze zwalniaj niezarządzaną pamięć przy użyciu odpowiednich metod, takich jak Marshal.FreeHGlobal(). Dodatkowo, bądź ostrożny przy używaniu kodu niebezpiecznego, ponieważ może on wprowadzić potencjalne ryzyka bezpieczeństwa, jeśli nie jest prawidłowo obsługiwany.

Span i asynchroniczne wywołania metod

Korzystanie ze Span w połączeniu z asynchronicznymi wywołaniami metod w C# to potężne połączenie, zwłaszcza przy operacjach na dużych ilościach danych lub operacjach I/O. Celem jest efektywne zarządzanie operacjami asynchronicznymi bez niepotrzebnego kopiowania danych. Przyjrzyjmy się, jak można wykorzystać Span w scenariuszach asynchronicznych:

1. Asynchroniczne operacje I/O:

Przy operacjach asynchronicznych we/wy, takich jak odczyt lub zapis danych do strumienia, można użyć Memory lub Span do efektywnej pracy z danymi bez tworzenia dodatkowych buforów.

using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task ProcessDataAsync(Stream stream)
    {
        const int bufferSize = 4096;
        byte[] buffer = new byte[bufferSize];
        while (true)
        {
            int bytesRead = await stream.ReadAsync(buffer.AsMemory());
            if (bytesRead == 0)
                break;

            // Process the data using Span without unnecessary copying
            ProcessData(buffer.AsSpan(0, bytesRead));
        }
    }

    static void ProcessData(Span<byte> data)
    {
        // Perform operations on the data
    }
}

W tym przykładzie metoda ReadAsync asynchronicznie odczytuje dane z strumienia do buforu. Metoda ProcessData następnie przetwarza dane bezpośrednio z Span<byte>, bez kopiowania ich do innego buforu.

2. Asynchroniczne operacje na plikach:

Podobnie jak w operacjach I/O, podczas pracy z asynchronicznymi operacjami na plikach można użyć Span, aby efektywnie przetwarzać dane bez dodatkowego kopiowania.

using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task ProcessFileAsync(string filePath)
    {
        const int bufferSize = 4096;
        using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[bufferSize];
            while (true)
            {
                int bytesRead = await fileStream.ReadAsync(buffer.AsMemory());
                if (bytesRead == 0)
                    break;

                // Process the data using Span without unnecessary copying
                ProcessData(buffer.AsSpan(0, bytesRead));
            }
        }
    }

    static void ProcessData(Span<byte> data)
    {
        // Perform operations on the data
    }
}

Tutaj metoda ReadAsync odczytuje dane z strumienia plików do bufora, a metoda ProcessData przetwarza dane bezpośrednio z Span<byte>.

3. Asynchroniczne przetwarzanie zadań:

Pracując z zadaniami asynchronicznymi, które produkują lub konsumują dane, można użyć Memory lub Span w celu uniknięcia niepotrzebnego kopiowania.

using System;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static async Task<int> ProcessDataAsync(int[] data)
    {
        // Asynchronous processing of data
        await Task.Delay(1000);
        // Returning the length of the processed data
        return data.Length;
    }

    static async Task Main()
    {
        int[] inputData = Enumerable.Range(1, 1000).ToArray();
        
        // Process the data asynchronously without copying
        int processedLength = await ProcessDataAsync(inputData.AsMemory());
        Console.WriteLine($"Processed data length: {processedLength}");
    }
}

W tym przykładzie metoda ProcessDataAsync przetwarza dane asynchronicznie i zwraca długość przetworzonych danych bez potrzeby dodatkowego kopiowania.

Przedstawiamy IronPDF

Przegląd biblioteki IronPDF to najnowsza biblioteka PDF dla C# od Iron Software, która może być używana do dynamicznego generowania pięknych dokumentów PDF za pomocą kodu C#. IronPDF zapewnia róznego rodzaju funkcje, takie jak generowanie PDF z HTML, konwertowanie zawartości HTML na PDF, scałanie lub dzielenie plików PDF itd.

Główną cechą IronPDF jest jego funkcjonalność HTML do PDF, która zachowuje układy i style. Może generować dokumenty PDF z treści internetowych, co czyni go idealnym do raportów, faktur i dokumentacji. To narzędzie obsługuje konwertowanie plików HTML, adresów URL i ciągów HTML na pliki PDF.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

Instalacja

IronPDF można zainstalować za pomocą menedżera pakietów NuGet dla IronPDF z konsoli lub używając menedżera pakietów Visual Studio.

dotnet add package IronPdf

C# Span (How It Works For Developers): Figure 1 - Install IronPDF using NuGet Package Manager by searching "IronPDF" in the search bar of NuGet Package Manager

using System;
using IronPdf;

class Program
{
    static void Main()
    {
        Console.WriteLine("Generating PDF using IronPDF.");
        var displayFirstName = "<p>First Name is Joe</p>".AsSpan();
        var displayLastName = "<p>Last Name is Doe</p>".AsSpan();
        var displayAddress = "<p>12th Main, 7Th Cross, New York</p>".AsSpan();
        var start = "<html><body>".AsSpan();
        var end = "</body></html>".AsSpan();
        var content = string.Concat(start.ToString(), displayFirstName.ToString(), displayLastName.ToString(), displayAddress.ToString(), end.ToString());
        var pdfDocument = new ChromePdfRenderer();
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("span.pdf");
    }
}

W tym przykładzie używamy Span w połączeniu z IronPDF, aby generować dokumenty PDF.

Wynik:

C# Span (Jak to działa dla deweloperów): Rysunek 2 - Wynik konsoli

Wygenerowany PDF:

C# Span (Jak to działa dla deweloperów): Rysunek 3 - Wynik PDF

Licencjonowanie (dostępna bezpłatna wersja próbna)

Informacje o licencji IronPDF. Ten klucz należy umieścić w pliku appsettings.json.

"IronPdf.LicenseKey": "your license key"
JSON

Podaj swój adres e-mail, aby otrzymać Licencję Trial.

Wnioski

Span w C# zapewnia potężny i wydajny sposób pracy z pamięcią, oferując korzyści w zakresie wydajności i elastyczności. Jego nieposiadająca własności, ciągła natura czyni go szczególnie odpowiednim w scenariuszach, gdzie minimalizowanie alokacji pamięci i kopiowania jest kluczowe. Wykorzystując Span, programiści mogą osiągnąć lepszą wydajność w różnorodnych aplikacjach, od manipulacji napisami po przetwarzanie numeryczne o wysokiej wydajności. Rozumiejąc jego funkcje i biorąc pod uwagę jego ograniczenia, deweloperzy mogą bezpiecznie i efektywnie wykorzystać Span do różnych zadań manipulacji pamięcią. Wraz z przeglądem biblioteki IronPDF, można go używać do generowania niesamowitych dokumentów PDF bez czekania na zakończenie i granic powrotu.

Odwiedź stronę szybki start dokumentacji IronPDF.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczącą ponad 50 osób, obsługującą NASA, Teslę i światowe agencje rządowe.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta