Partilhar via


Criar novas cadeias de caracteres no .NET

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 um StackOverflowException. Este exemplo mostra o padrão C# stackalloc ; O Visual Basic não suporta stackalloc, mas ainda pode chamar o String(ReadOnlySpan<char>) construtor quando tem um ReadOnlySpan<char>.
  • String.Create aloca 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-se stackalloc + new String(span) cadeias pequenas (tipicamente menos de algumas centenas de caracteres) com um tamanho conhecido e limitado. Usa String.Create quando o tamanho possa ser grande, quando quiser evitar a sobrecarga da pilha, ou ao passar estado para o callback sem boxing.

Ver também