Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
.NET позволяет создавать строки с помощью простого назначения, а также перегружает конструктор класса для поддержки создания строки с помощью ряда различных параметров. .NET также предоставляет несколько методов в System.String классе, которые создают новые строковые объекты путем объединения нескольких строк, массивов строк или объектов.
Создание строк с помощью присваивания
Самый простой способ создать новый String объект — просто назначить строковый литерал объекту String .
Создание строк с помощью конструктора классов
Для создания строк из массивов символов можно использовать перегрузки конструктора класса String. Вы также можете создать новую строку путем дублирования определенного символа заданного количества раз. Перегрузка конструктора String(ReadOnlySpan<Char>) принимает ReadOnlySpan<T> или стек-выделенный Span<T> символов и позволяет избежать выделения промежуточного массива символов в управляемой куче, когда вы создаете небольшие строки известного размера, хотя сам результирующий экземпляр строки все равно выделяется в управляемой куче.
Методы, возвращающие строки
В следующей таблице перечислены несколько полезных методов, возвращающих новые строковые объекты.
| Имя метода | Использование |
|---|---|
| String.Format | Создает форматированную строку из набора входных объектов. |
| String.Concat | Создает строки из двух или более строк. |
| String.Join | Создает новую строку путем объединения массива строк. |
| String.Insert | Создает новую строку, вставляя строку в указанный индекс существующей строки. |
| String.CopyTo | Копирует указанные символы в строку в указанную позицию в массиве символов. |
| String.Create | Создает новую строку указанной длины, заполняя символы с помощью обратного вызова, который получает доступный Span<T> для записи объект состояния и объект состояния, предоставленный вызывающим объектом. |
String.Format
Метод можно использовать String.Format для создания форматированных строк и сцепления строк, представляющих несколько объектов. Этот метод автоматически преобразует любой переданный объект в строку. Например, если приложение должно отображать Int32 значение и DateTime значение для пользователя, можно легко создать строку для представления этих значений Format с помощью метода. Сведения о соглашениях о форматировании, используемых с этим методом, см. в разделе о составном форматировании.
В следующем примере метод используется для создания строки, которая использует Format целочисленную переменную.
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.
В этом примере DateTime.Now показывает текущую дату и время в формате, определённом культурными настройками, связанными с текущим потоком.
String.Concat
Этот String.Concat метод можно использовать для легкого создания нового строкового объекта из двух или более существующих объектов. Он предоставляет независимый от языка способ объединения строк. Этот метод принимает любой класс, производный от System.Object. В следующем примере создается строка из двух существующих строковых объектов и символа разделения.
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
Метод String.Join создает новую строку из массива строк и строки разделителя. Этот метод полезен, если вы хотите объединить несколько строк, делая список, возможно, разделенный запятой.
В следующем примере используется пространство для привязки массива строк.
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
Метод String.Insert создает новую строку, вставляя строку в указанную позицию в другой строке. Этот метод использует отсчитываемый от нуля индекс. В следующем примере строка вставляется в пятую позицию MyString индекса и создает новую строку с этим значением.
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
Метод String.CopyTo копирует части строки в массив символов. Можно указать начальный индекс строки и количество символов, которые нужно скопировать. Этот метод принимает исходный индекс, массив символов, целевой индекс и количество символов для копирования. Все индексы основаны на нулях.
В следующем примере метод используется CopyTo для копирования символов слова "Hello" из строкового объекта в первую позицию индекса массива символов.
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
Этот String.Create метод позволяет программно заполнить символы новой строки с помощью обратного вызова. Обратный вызов получает записываемый набор символов Span<T> и объект состояния, предоставленный вызывающим кодом, чтобы вы могли создавать содержимое строки без выделения промежуточных буферов символов. Обратный вызов может по-прежнему выделять память, например, если он захватывает локальные переменные или вызывает другие API, интенсивно использующие выделение памяти.
В следующем примере используется String.Create для создания пятизначной строки из последовательных символов алфавита:
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 предназначен для сценариев с учетом производительности, в которых вы заранее знаете окончательную длину строки и хотите избежать выделения промежуточных буферов символов. Среда выполнения выделяет новую строку, передает её буфер напрямую в качестве Span<char> вашему обратному вызову и возвращает неизменяемую строку после завершения обратного вызова. Копия данных не создается после завершения обратного вызова.
String.Create и new String(Span<char>)
Еще одним вариантом эффективного создания строк является выделение буфера символов с помощью stackalloc, его заполнение, а затем передача в конструктор 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
Оба подхода выделяют окончательную строку ровно один раз. Основные различия:
-
stackalloc+new string(span)помещает рабочий буфер в стек. Это самое быстрое для небольших буферов фиксированного размера, но стек является конечным ресурсом; большие или глубоко вложенные выделения могут вызватьStackOverflowException. В этом примере показан шаблон C#stackalloc; Visual Basic не поддерживаетstackalloc, но он по-прежнему может вызыватьString(ReadOnlySpan<char>)конструктор при наличииReadOnlySpan<char>. -
String.Createвыделяет рабочий буфер в куче как часть самого объекта строки, поэтому нет давления стека. Он также принимает типизированный параметр состояния, который среда выполнения передает в обратный вызов без упаковки, избегая затрат на упаковку, если состояние является ссылочным типом или незахваченной структурой. Как правило, предпочитайтеstackalloc+new String(span)небольшие строки (обычно меньше нескольких сотен символов) с известным, ограничивающим размером. ИспользуйтеString.Create, когда размер может быть большим, если вы хотите избежать нагрузки на стек или при передаче состояния в функцию обратного вызова без упаковки.