Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ługujestackalloc, ale nadal może wywołać konstruktorString(ReadOnlySpan<char>), jeśli posiadaszReadOnlySpan<char>. -
String.Createprzydziela 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, preferujstackalloc+new String(span)małe ciągi (zazwyczaj mniej niż kilkaset znaków) o znanym, ograniczonym rozmiarze. UżyjString.Create, gdy rozmiar może być duży, gdy chcesz uniknąć przeciążenia stosu lub podczas przekazywania stanu do wywołania zwrotnego bez opakowywania.