Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
.NET umožňuje vytváření řetězců pomocí jednoduchého přiřazení a také přetěžuje konstruktor třídy pro podporu vytváření řetězců pomocí řady různých parametrů. .NET také poskytuje několik metod ve System.String třídě, které vytvářejí nové řetězcové objekty kombinací několika řetězců, polí řetězců nebo objektů.
Vytváření řetězců pomocí přiřazení
Nejjednodušší způsob, jak vytvořit nový String objekt, je jednoduše přiřadit řetězcový literál k objektu String .
Vytváření řetězců pomocí konstruktoru třídy
Můžete použít přetížené konstruktory třídy String k vytvoření řetězců z polí znaků. Můžete také vytvořit nový řetězec duplikováním konkrétního znaku určitý početkrát. Přetížení String(ReadOnlySpan<Char>) konstruktoru přijímá ReadOnlySpan<T> nebo přiděluje Span<T> zásobník znaků a zabraňuje přidělení zprostředkující pole znaků na spravované haldě při vytváření malých řetězců známé velikosti, ačkoli výsledná instance řetězce je stále přidělena na spravované haldě.
Metody, které vracejí řetězce
Následující tabulka uvádí několik užitečných metod, které vracejí nové objekty řetězců.
| Název metody | Používání |
|---|---|
| String.Format | Vytvoří formátovaný řetězec ze sady vstupních objektů. |
| String.Concat | Vytvoří řetězce ze dvou nebo více řetězců. |
| String.Join | Vytvoří nový řetězec zkombinováním pole řetězců. |
| String.Insert | Vytvoří nový řetězec vložením řetězce do zadaného indexu existujícího řetězce. |
| String.CopyTo | Zkopíruje zadané znaky v řetězci do zadané pozice v poli znaků. |
| String.Create | Vytvoří nový řetězec se zadanou délkou a naplní znaky zpětným voláním, který přijímá zapisovatelný Span<T> a stavový objekt zadaný volajícím. |
String.Format
Tuto String.Format metodu můžete použít k vytvoření formátovaných řetězců a zřetězení řetězců představujících více objektů. Tato metoda automaticky převede všechny předané objekty na řetězec. Pokud například vaše aplikace musí uživateli zobrazit Int32 hodnotu a DateTime hodnotu, můžete snadno vytvořit řetězec, který bude tyto hodnoty reprezentovat pomocí Format této metody. Informace o konvencích formátování používaných s touto metodou najdete v části o složeného formátování.
Následující příklad používá metodu Format k vytvoření řetězce, který používá celočíselnou proměnnou.
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.
V tomto příkladu DateTime.Now zobrazí aktuální datum a čas způsobem určeným jazykovou verzí přidruženou k aktuálnímu vláknu.
String.Concat
Metodu String.Concat lze použít ke snadnému vytvoření nového objektu řetězce ze dvou nebo více existujících objektů. Poskytuje jazykově nezávislý způsob zřetězení řetězců. Tato metoda přijímá libovolnou třídu, která je odvozena z System.Object. Následující příklad vytvoří řetězec ze dvou existujících objektů řetězce a oddělující znak.
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 vytvoří nový řetězec z pole řetězců a oddělovacího řetězce. Tato metoda je užitečná, pokud chcete zřetězit více řetězců dohromady a vytvořit seznam, možná oddělený čárkou.
Následující příklad používá mezeru k propojení pole řetězců.
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 vytvoří nový řetězec vložením řetězce na určenou pozici v jiném řetězci. Tato metoda používá index založený na nule. Následující příklad vloží řetězec do páté pozice indexu MyString a vytvoří nový řetězec s touto hodnotou.
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 zkopíruje části řetězce do pole znaků. Můžete zadat počáteční index řetězce i počet znaků, které se mají zkopírovat. Tato metoda přebírá zdrojový index, pole znaků, cílový index a počet znaků, které se mají zkopírovat. Všechny indexy jsou založené na nule.
Následující příklad používá metodu CopyTo ke zkopírování znaků slova "Hello" z objektu řetězce na první pozici indexu pole znaků.
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žňuje programově vyplnit znaky nového řetězce pomocí zpětného volání. Zpětné volání přijímá zapisovatelné Span<T> znaky a objekt stavu zadaný volajícím, takže můžete vytvořit obsah řetězce bez přidělení mezilehlých vyrovnávacích pamětí znaků. Samotné zpětné volání může stále provádět přidělování, například pokud zachycuje místní proměnné nebo volá jiná rozhraní API, která vyžadují hodně přidělování.
Následující příklad používá String.Create k sestavení řetězce s pěti znaky z po sobě jdoucích abecední znaky:
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 je určen pro vysoce výkonné scénáře, kde znáte konečnou délku řetězce předem a chcete se vyhnout přidělování přechodných znakových vyrovnávacích pamětí. Modul runtime přidělí nový řetězec, předá svou záložní vyrovnávací paměť přímo zpět zpětnému volání jako Span<char>a vrátí neměnný řetězec, jakmile zpětné volání vrátí. Po dokončení zpětného volání nedojde k žádné kopii dat.
String.Create Vs. new String(Span<char>)
Další možností, jak efektivně vytvářet řetězce, je přidělit znakové pole stackalloc, vyplnit ho a předat do konstruktoru 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 přístupy přidělují poslední řetězec přesně jednou. Mezi hlavní rozdíly patří:
-
stackalloc+new string(span)umístí pracovní vyrovnávací paměť do zásobníku. To je nejrychlejší pro malé vyrovnávací paměti s pevnou velikostí, ale zásobník je konečný prostředek; velké nebo hluboce vnořené alokace mohou způsobit chybuStackOverflowException. Tento příklad ukazuje vzor ve formátu C#stackalloc; Visual Basic nepodporujestackalloc, ale může stále volat konstruktorString(ReadOnlySpan<char>), pokud máteReadOnlySpan<char>. -
String.Createalokuje pracovní vyrovnávací paměť na haldě jako součást samotného objektu řetězce, takže není vytvářen žádný tlak na zásobník. Přijímá také parametr zadaného stavu, který modul runtime předá zpětnému volání bez boxování, a zabraňuje rozdělení do rámečku, pokud je stav typem odkazu nebo nezachytěnou strukturou. Obecně upřednostňujtestackalloc+new String(span)pro malé řetězce (obvykle méně než několik set znaků) s předem známou a omezenou velikostí. PoužijteString.Create, když může být velikost velká, nebo když se chcete vyhnout tlaku na zásobník, nebo také při předání stavu do zpětného volání bez boxování.