Compartilhar via


Criar novas cadeias de caracteres no .NET

O .NET permite que cadeias de caracteres sejam criadas usando atribuição simples e sobrecarrega um construtor de classe para dar suporte à criação de cadeias de caracteres usando um número de parâmetros diferentes. O .NET também fornece vários métodos na classe System.String 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 maneira mais fácil para criar um novo objeto String é simplesmente atribuir uma cadeia de caracteres literal a um objeto String.

Criar cadeias de caracteres usando um construtor de classe

Você pode usar sobrecargas do constructo de classe String para criar cadeias de caracteres de matrizes de caracteres. Você também pode criar uma nova cadeia de caracteres duplicando um caractere específico, m número de vezes especificado. A String(ReadOnlySpan<Char>) sobrecarga do construtor aceita um ReadOnlySpan<T> ou um Span<T> alocado na pilha de caracteres e evita alocar uma matriz de caracteres intermediária no heap gerenciado quando você cria pequenas strings de um tamanho conhecido, embora a instância de string resultante ainda esteja alocada no heap gerenciado.

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 de um conjunto de objetos de entrada.
String.Concat Cria cadeias de caracteres de duas ou mais cadeias de caracteres.
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 caracteres especificados de uma cadeia de caracteres para uma posição especificada em uma matriz de caracteres.
String.Create Cria uma nova cadeia de caracteres de um comprimento especificado, preenchendo caracteres por meio 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 método String.Format para criar cadeias de caracteres formatadas e concatenar cadeias de caracteres que representam vários objetos. Este método converte automaticamente qualquer objeto passado em uma cadeia de caracteres. Por exemplo, se seu aplicativo precisar exibir um valor Int32 e um valor DateTime para o usuário, você pode facilmente criar uma cadeia de caracteres para representar esses valores usando o método Format. Para obter informações sobre as convenções de formatação usadas com esse método, consulte a seção sobre formatação de composição.

O exemplo a seguir usa o método Format para criar uma cadeia de caracteres que usa uma variável de inteiro.

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 exibe a data e a hora atuais de uma maneira especificada pela cultura associada ao thread atual.

String.Concat

O método String.Concat pode ser usado para criar facilmente um novo objeto de cadeia de caracteres de dois ou mais objetos existentes. Ele fornece uma maneira independente da 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 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 método String.Join cria uma nova cadeia de caracteres de uma matriz de cadeias de caracteres e uma cadeia de caracteres de separador. Esse método é útil se você quiser concatenar várias cadeias de caracteres fazendo uma lista, talvez separada por vírgula.

O exemplo a seguir usa um espaço para associar uma matriz de cadeias 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 método String.Insert 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 quinta posição do índice 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 método String.CopyTo 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. Este 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 método CopyTo para copiar os caracteres da palavra "Hello" de um objeto de cadeia de caracteres 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 que você preencha programaticamente os caracteres de uma nova cadeia de caracteres usando um retorno de chamada. O callback recebe um gravável Span<T> de caracteres e um objeto de estado fornecido pelo chamador, para que você possa construir o conteúdo da string sem precisar alocar buffers de caracteres intermediários. O retorno de chamada em si ainda poderá alocar, por exemplo, se capturar variáveis locais ou chamar outras APIs pesadas de alocação.

O exemplo a seguir usa String.Create para criar uma cadeia de caracteres de cinco caracteres com base em caracteres alfabéticos consecutivos.

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 foi projetado para cenários sensíveis ao desempenho, nos quais você conhece o comprimento final da string com antecedência e deseja evitar a alocação de buffers de caracteres intermediários. O runtime aloca uma nova cadeia de caracteres, passa seu buffer de backup diretamente para o retorno de chamada como um Span<char>e retorna a cadeia de caracteres imutável quando o retorno de chamada é retornado. Após a conclusão do retorno de chamada, nenhuma cópia dos dados ocorre.

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

Outra opção para criar cadeias de caracteres com eficiência é alocar um buffer de caracteres com stackalloc, preenchê-lo e passá-lo para o 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 de caracteres final exatamente uma vez. As principais diferenças são:

  • stackalloc + new string(span) coloca o buffer de trabalho na pilha. Isso é mais rápido para buffers pequenos de tamanho fixo, mas a pilha é um recurso finito; alocações grandes ou aninhadas em profundidade podem causar um StackOverflowException. Este exemplo mostra o padrão C# stackalloc ; O Visual Basic não dá suporte stackalloc, mas ainda pode chamar o String(ReadOnlySpan<char>) construtor quando você tem um ReadOnlySpan<char>.
  • String.Create aloca o buffer de trabalho no heap como parte do próprio objeto string, de modo que não haja pressão na pilha. Também suporta um parâmetro de estado tipado que o runtime passa para a função de retorno sem encaixotamento, evitando alocações de encaixotamento quando o estado é um tipo de referência ou uma estrutura que não foi capturada. Em geral, prefira stackalloc + new String(span) cadeias de caracteres pequenas (normalmente menos de algumas centenas de caracteres) com um tamanho limitado conhecido. Use String.Create quando o tamanho pode ser grande, quando você quiser evitar a pressão da pilha ou ao passar o estado para o retorno de chamada sem boxe.

Consulte também