Tworzenie nowych ciągów na platformie .NET

Platforma .NET umożliwia tworzenie ciągów przy użyciu prostego przypisania, a także przeciąża konstruktor klasy do obsługi tworzenia ciągów przy użyciu wielu różnych parametrów. Platforma .NET udostępnia również kilka metod w System.String klasie, które tworzą nowe obiekty ciągów, łącząc kilka ciągów, tablic ciągów lub obiektów.

Tworzenie ciągów przy użyciu przypisania

Najprostszym sposobem utworzenia nowego String obiektu jest po prostu przypisanie literału ciągu do String obiektu.

Tworzenie ciągów przy użyciu konstruktora klasy

Za pomocą przeciążeń konstruktora String klasy można tworzyć ciągi na podstawie tablic znaków. Możesz również utworzyć nowy ciąg, duplikując określony znak określoną liczbę razy. String(ReadOnlySpan<Char>) Przeciążenie konstruktora akceptuje ReadOnlySpan<T> lub przydzielony na stosie Span<T> znaków i unika przydzielania pośredniej tablicy znaków na zarządzanej stercie podczas tworzenia małych ciągów o znanym rozmiarze, chociaż wynikowy ciąg jest nadal przydzielany na zarządzanej stercie.

Metody zwracające ciągi znaków

W poniższej tabeli wymieniono kilka przydatnych metod, które zwracają nowe obiekty ciągów.

Nazwa metody Użyj
String.Format Tworzy sformatowany ciąg z zestawu obiektów wejściowych.
String.Concat Tworzy ciągi z co najmniej dwóch ciągów.
String.Join Tworzy nowy ciąg, łącząc tablicę ciągów.
String.Insert Tworzy nowy ciąg, wstawiając ciąg do określonego indeksu istniejącego ciągu.
String.CopyTo Kopiuje określone znaki w ciągu do określonej pozycji w tablicy znaków.
String.Create Tworzy nowy ciąg o określonej długości, wypełniając znaki za pośrednictwem funkcji zwrotnej, która odbiera zapisywalny Span<T> i przekazany przez wywołującego obiekt stanu.

String.Format

Za pomocą tej String.Format metody można tworzyć sformatowane ciągi i łączyć ciągi reprezentujące wiele obiektów. Ta metoda automatycznie konwertuje dowolny przekazany obiekt na ciąg. Jeśli na przykład aplikacja musi wyświetlać Int32 użytkownikowi wartość i DateTime wartość, można łatwo skonstruować ciąg reprezentujący te wartości przy użyciu Format metody. Aby uzyskać informacje na temat konwencji formatowania używanych w tej metodzie, zobacz sekcję dotyczącą formatowania złożonego.

W poniższym przykładzie użyto metody Format do utworzenia ciągu, który używa zmiennej całkowitej.

int numberOfFleas = 12;
string miscInfo = String.Format("Your dog has {0} fleas. " +
                                "It is time to get a flea collar. " +
                                "The current universal date is: {1:u}.",
                                numberOfFleas, DateTime.Now);
Console.WriteLine(miscInfo);
// The example displays the following output:
//       Your dog has 12 fleas. It is time to get a flea collar.
//       The current universal date is: 2008-03-28 13:31:40Z.
Dim numberOfFleas As Integer = 12
Dim miscInfo As String = String.Format("Your dog has {0} fleas. " & _
                                       "It is time to get a flea collar. " & _
                                       "The current universal date is: {1:u}.", _
                                       numberOfFleas, Date.Now)
Console.WriteLine(miscInfo)
' The example displays the following output:
'       Your dog has 12 fleas. It is time to get a flea collar. 
'       The current universal date is: 2008-03-28 13:31:40Z.

W tym przykładzie DateTime.Now wyświetla bieżącą datę i godzinę w sposób określony przez kulturę skojarzona z bieżącym wątkiem.

String.Concat

Metoda String.Concat może być użyta do łatwego utworzenia nowego obiektu ciągu z dwóch lub więcej istniejących obiektów. Zapewnia niezależny od języka sposób łączenia ciągów. Ta metoda akceptuje każdą klasę, która pochodzi od System.Object. Poniższy przykład tworzy ciąg na podstawie dwóch istniejących obiektów ciągów i znaku oddzielającego.

string helloString1 = "Hello";
string helloString2 = "World!";
Console.WriteLine(String.Concat(helloString1, ' ', helloString2));
// The example displays the following output:
//      Hello World!
Dim helloString1 As String = "Hello"
Dim helloString2 As String = "World!"
Console.WriteLine(String.Concat(helloString1, " "c, helloString2))
' The example displays the following output:
'      Hello World!

String.Join

Metoda String.Join tworzy nowy ciąg z tablicy ciągów i ciągu separatora. Ta metoda jest przydatna, jeśli chcesz połączyć wiele ciągów razem, tworząc listę rozdzielaną przecinkami.

W poniższym przykładzie użyto spacji do powiązania tablicy ciągów.

string[] words = {"Hello", "and", "welcome", "to", "my" , "world!"};
Console.WriteLine(String.Join(" ", words));
// The example displays the following output:
//      Hello and welcome to my world!
Dim words() As String = {"Hello", "and", "welcome", "to", "my", "world!"}
Console.WriteLine(String.Join(" ", words))
' The example displays the following output:
'      Hello and welcome to my world!

String.Insert

Metoda String.Insert tworzy nowy ciąg, wstawiając ciąg w określoną pozycję w innym ciągu. Ta metoda używa indeksu opartego na zerach. Poniższy przykład wstawia ciąg do piątej pozycji indeksu MyString i tworzy nowy ciąg z tą wartością.

string sentence = "Once a time.";
 Console.WriteLine(sentence.Insert(4, " upon"));
 // The example displays the following output:
 //      Once upon a time.
Dim sentence As String = "Once a time."
Console.WriteLine(sentence.Insert(4, " upon"))
' The example displays the following output:
'      Once upon a time.

String.CopyTo

Metoda String.CopyTo kopiuje fragmenty ciągu do tablicy znaków. Można określić zarówno indeks początkowy ciągu, jak i liczbę znaków do skopiowania. Ta metoda przyjmuje indeks źródłowy, tablicę znaków, indeks docelowy i liczbę znaków do skopiowania. Wszystkie indeksy są oparte na zera.

W poniższym przykładzie użyto CopyTo metody do skopiowania znaków wyrazu "Hello" z obiektu ciągu do pierwszej pozycji indeksu tablicy znaków.

string greeting = "Hello World!";
char[] charArray = {'W','h','e','r','e'};
Console.WriteLine($"The original character array: {new string(charArray)}");
greeting.CopyTo(0, charArray,0 ,5);
Console.WriteLine($"The new character array: {new string(charArray)}");
// The example displays the following output:
//       The original character array: Where
//       The new character array: Hello
Dim greeting As String = "Hello World!"
Dim charArray() As Char = {"W"c, "h"c, "e"c, "r"c, "e"c}
Console.WriteLine("The original character array: {0}", New String(charArray))
greeting.CopyTo(0, charArray, 0, 5)
Console.WriteLine("The new character array: {0}", New String(charArray))
' The example displays the following output:
'       The original character array: Where
'       The new character array: Hello

String.Create

Metoda String.Create umożliwia programowe wypełnianie znaków nowego ciągu przy użyciu wywołania zwrotnego. Wywołanie zwrotne odbiera zapisywalne Span<T> znaki i obiekt stanu dostarczonego przez obiekt wywołujący, dzięki czemu można skompilować zawartość ciągu bez przydzielania buforów znaków pośrednich. Samo wywołanie zwrotne może nadal powodować alokację, na przykład jeśli przechwytuje zmienne lokalne lub wywołuje inne API ciężkie pod względem alokacji.

W poniższym przykładzie użyto String.Create do utworzenia pięcioznakowego ciągu z kolejnych liter alfabetu.

string result = string.Create(5, 'a', (span, firstChar) =>
{
    for (int i = 0; i < span.Length; i++)
    {
        span[i] = (char)(firstChar + i);
    }
});

Console.WriteLine(result); // abcde
Module Program
    Sub Main()
        Dim result As String = String.Create(5, "a"c, Sub(span, firstChar)
                                                           For i As Integer = 0 To span.Length - 1
                                                               span(i) = ChrW(AscW(firstChar) + i)
                                                           Next
                                                       End Sub)

        Console.WriteLine(result) ' abcde
    End Sub
End Module

String.Create jest przeznaczony dla scenariuszy z uwzględnieniem wydajności, w których znasz z wyprzedzeniem końcową długość ciągu i chcesz uniknąć przydzielania buforów znaków pośrednich. Środowisko uruchomieniowe przydziela nowy łańcuch, przekazuje jego bufor pomocniczy bezpośrednio do wywołania zwrotnego jako Span<char>, a następnie zwraca niezmienny łańcuch po powrocie wywołania zwrotnego. Po zakończeniu wywołania zwrotnego nie ma kopii danych.

String.Create a new String(Span<char>)

Inną opcją efektywnego kompilowania ciągów jest przydzielenie buforu znaków za pomocą stackalloc, wypełnienie go i przekazanie go do konstruktora String(ReadOnlySpan<char>) :

static string CreateStringFromSpan()
{
    Span<char> span = stackalloc char[5];
    for (int i = 0; i < 5; i++)
    {
        span[i] = (char)('a' + i);
    }
    return new string(span);
}

Console.WriteLine(CreateStringFromSpan()); // abcde

Oba podejścia przydzielą końcowy ciąg dokładnie raz. Najważniejsze różnice to:

  • stackalloc + new string(span) umieszcza bufor roboczy na stosie. Jest to najszybsze w przypadku małych buforów o stałym rozmiarze, ale stos jest zasobem skończonym i duże lub głęboko zagnieżdżone alokacje mogą spowodować StackOverflowException. W tym przykładzie pokazano wzorzec języka C# stackalloc; język Visual Basic nie obsługuje stackalloc, ale nadal może wywołać konstruktor String(ReadOnlySpan<char>), jeśli posiadasz ReadOnlySpan<char>.
  • String.Create przydziela bufor roboczy na stercie jako część samego obiektu ciągu, więc nie ma żadnego ciśnienia stosu. Akceptuje również typowany parametr stanu, który środowisko uruchomieniowe przekazuje do wywołania zwrotnego bez boksu, unikając alokacji boksu, gdy stan jest typem odwołania lub nieuchwyconą strukturą. Ogólnie rzecz biorąc, preferuj stackalloc + new String(span) małe ciągi (zazwyczaj mniej niż kilkaset znaków) o znanym, ograniczonym rozmiarze. Użyj String.Create, gdy rozmiar może być duży, gdy chcesz uniknąć przeciążenia stosu lub podczas przekazywania stanu do wywołania zwrotnego bez opakowywania.

Zobacz też