Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
O .NET permite que cadeias de caracteres sejam criadas usando atribuição simples e também sobrecarrega um construtor de classe para dar suporte à criação de cadeia de caracteres usando vários parâmetros diferentes. O .NET também fornece vários métodos na System.String classe que criam novos objetos de cadeia de caracteres combinando várias cadeias de caracteres, matrizes de cadeias de caracteres ou objetos.
Criar cadeias de caracteres usando atribuição
A forma mais simples de criar um novo objeto String é apenas atribuir uma string literal a um objeto String.
Criar cadeias de caracteres usando um construtor de classe
Você pode usar sobrecargas do construtor da String classe para criar cadeias de caracteres a partir de matrizes de caracteres. Você também pode criar uma nova cadeia de caracteres duplicando um caractere específico um número especificado de vezes. A String(ReadOnlySpan<Char>) sobrecarga do construtor aceita um ReadOnlySpan<T> ou um Span<T> de caracteres alocados na stack e evita que um array intermédio de caracteres seja alocado no heap gerido ao construir pequenas cadeias de um tamanho conhecido, embora a instância de cadeia resultante ainda seja alocada no heap gerido.
Métodos que retornam cadeias de caracteres
A tabela a seguir lista vários métodos úteis que retornam novos objetos de cadeia de caracteres.
| Nome do método | Utilização |
|---|---|
| String.Format | Cria uma cadeia de caracteres formatada a partir de um conjunto de objetos de entrada. |
| String.Concat | Cria cadeias a partir de duas ou mais cadeias. |
| String.Join | Cria uma nova cadeia de caracteres combinando uma matriz de cadeias de caracteres. |
| String.Insert | Cria uma nova cadeia de caracteres inserindo uma cadeia de caracteres no índice especificado de uma cadeia de caracteres existente. |
| String.CopyTo | Copia os caracteres especificados de uma string para uma posição especificada numa matriz de caracteres. |
| String.Create | Cria uma nova cadeia de caracteres de um comprimento especificado, populando os caracteres através de uma função de retorno que recebe um objeto gravável Span<T> e um objeto de estado fornecido pelo chamador. |
String.Format
Você pode usar o String.Format método para criar cadeias de caracteres formatadas e concatenar cadeias de caracteres que representam vários objetos. Esse método converte automaticamente qualquer objeto passado em uma cadeia de caracteres. Por exemplo, se seu aplicativo deve exibir um Int32 valor e um DateTime valor para o usuário, você pode facilmente construir uma cadeia de caracteres para representar esses valores usando o Format método. Para obter informações sobre convenções de formatação usadas com esse método, consulte a seção sobre formatação composta.
O exemplo a seguir usa o Format método para criar uma cadeia de caracteres que usa uma variável inteira.
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.
Neste exemplo, DateTime.Now apresenta a data e hora atuais de uma forma especificada pela cultura associada ao thread atual.
String.Concat
O String.Concat método pode ser usado para criar facilmente um novo objeto string a partir de dois ou mais objetos existentes. Ele fornece uma maneira independente de linguagem para concatenar cadeias de caracteres. Este método aceita qualquer classe que deriva de System.Object. O exemplo a seguir cria uma cadeia de caracteres a partir de dois objetos de cadeia de caracteres existentes e um caractere de separação.
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
O String.Join método cria uma nova cadeia de caracteres a partir de uma matriz de cadeias de caracteres e uma cadeia de caracteres separadora. Este método é útil se você quiser concatenar várias cadeias de caracteres juntas, fazendo uma lista talvez separada por uma vírgula.
O exemplo a seguir usa um espaço para vincular uma matriz de cadeia de caracteres.
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
O String.Insert método cria uma nova cadeia de caracteres inserindo uma cadeia de caracteres em uma posição especificada em outra cadeia de caracteres. Este método usa um índice baseado em zero. O exemplo a seguir insere uma cadeia de caracteres na posição de índice cinco de MyString e cria uma nova cadeia de caracteres com esse valor.
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
O String.CopyTo método copia partes de uma cadeia de caracteres em uma matriz de caracteres. Você pode especificar o índice inicial da cadeia de caracteres e o número de caracteres a serem copiados. Esse método usa o índice de origem, uma matriz de caracteres, o índice de destino e o número de caracteres a serem copiados. Todos os índices são baseados em zero.
O exemplo a seguir usa o CopyTo método para copiar os caracteres da palavra "Hello" de um objeto string para a primeira posição de índice de uma matriz de caracteres.
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
O String.Create método permite-te preencher programaticamente os caracteres de uma nova string usando um callback. O callback recebe um objeto de escrita Span<T> de caracteres e um objeto de estado fornecido pelo chamador, permitindo construir o conteúdo da string sem alocar buffers intermediários de caracteres. O "callback" em si pode ainda realizar alocações, por exemplo, se capturar variáveis locais ou chamar outras APIs que exigem muita alocação.
O exemplo seguinte serve String.Create para construir uma cadeia de cinco caracteres a partir de caracteres consecutivos do alfabeto:
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 é concebido para cenários sensíveis ao desempenho, onde conheces o comprimento final da cadeia antecipadamente e queres evitar alocar buffers intermédios de caracteres. O runtime aloca uma nova string, passa o seu buffer de suporte diretamente para o seu callback como Span<char>, e devolve a string imutável assim que o callback retorna. Não ocorre cópia dos dados após a conclusão do callback.
String.Create vs. new String(Span<char>)
Outra opção para construir cadeias de forma eficiente é alocar um buffer de caracteres com stackalloc, preenchê-lo e passá-lo ao String(ReadOnlySpan<char>) construtor:
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
Ambas as abordagens alocam a cadeia final exatamente uma vez. As principais diferenças são:
-
stackalloc+new string(span)Coloca o buffer de trabalho na pilha. Isto é mais rápido para buffers pequenos e de tamanho fixo , mas a pilha é um recurso finito; Alocações grandes ou profundamente aninhadas podem causar umStackOverflowException. Este exemplo mostra o padrão C#stackalloc; O Visual Basic não suportastackalloc, mas ainda pode chamar oString(ReadOnlySpan<char>)construtor quando tem umReadOnlySpan<char>. -
String.Createaloca o buffer de trabalho no heap como parte do próprio objeto string em si, por isso não há pressão na pilha. Também aceita um parâmetro de estado de execução tipado que o tempo de execução passa para o seu callback sem boxing, evitando alocações de boxing quando o estado é um tipo de referência ou um struct não capturado. Em geral, preferem-sestackalloc+new String(span)cadeias pequenas (tipicamente menos de algumas centenas de caracteres) com um tamanho conhecido e limitado. UsaString.Createquando o tamanho possa ser grande, quando quiser evitar a sobrecarga da pilha, ou ao passar estado para o callback sem boxing.