Cadeias de caracteres (Guia de Programação em C#)Strings (C# Programming Guide)

Uma cadeia de caracteres é um objeto do tipo String cujo valor é texto.A string is an object of type String whose value is text. Internamente, o texto é armazenado como uma coleção sequencial somente leitura de objetos Char.Internally, the text is stored as a sequential read-only collection of Char objects. Não há um caractere de finalização null ao fim de uma cadeia em C#. Portanto, uma cadeia de caracteres em C# pode ter qualquer número de caracteres nulos inseridos ('\0').There is no null-terminating character at the end of a C# string; therefore a C# string can contain any number of embedded null characters ('\0'). A propriedade Char de uma cadeia de caracteres representa o número de objetos Length que ela contém e não o número de caracteres Unicode.The Length property of a string represents the number of Char objects it contains, not the number of Unicode characters. Para acessar os pontos de código Unicode individuais em uma cadeia de caracteres, use o objeto StringInfo.To access the individual Unicode code points in a string, use the StringInfo object.

cadeia de caracteres vs. System.Stringstring vs. System.String

Em C#, a palavra-chave string é um alias para String.In C#, the string keyword is an alias for String. Portanto, String e string são equivalentes, e você pode usar a convenção de nomenclatura que preferir.Therefore, String and string are equivalent, and you can use whichever naming convention you prefer. A classe String fornece vários métodos para criar, manipular e comparar cadeias de caracteres com segurança.The String class provides many methods for safely creating, manipulating, and comparing strings. Além disso, a linguagem C# sobrecarrega alguns operadores para simplificar operações comuns de cadeia de caracteres.In addition, the C# language overloads some operators to simplify common string operations. Para saber mais sobre a palavra-chave, confira cadeia de caracteres.For more information about the keyword, see string. Para obter mais informações sobre o tipo e seus métodos, consulte String.For more information about the type and its methods, see String.

Declaração e inicialização de cadeias de caracteresDeclaring and Initializing Strings

Você pode declarar e inicializar cadeias de caracteres de várias maneiras, conforme mostrado no seguinte exemplo:You can declare and initialize strings in various ways, as shown in the following example:

// Declare without initializing.
string message1;

// Initialize to null.
string message2 = null;

// Initialize as an empty string.
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

//Initialize with a regular string literal.
string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0";

// Initialize with a verbatim string literal.
string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0";

// Use System.String if you prefer.
System.String greeting = "Hello World!";

// In local variables (i.e. within a method body)
// you can use implicit typing.
var temp = "I'm still a strongly-typed System.String!";

// Use a const string to prevent 'message4' from
// being used to store another string value.
const string message4 = "You can't get rid of me!";

// Use the String constructor only when creating
// a string from a char*, char[], or sbyte*. See
// System.String documentation for details.
char[] letters = { 'A', 'B', 'C' };
string alphabet = new string(letters);

Observe que você não usa o operador new para criar um objeto de cadeia de caracteres, exceto ao inicializar a cadeia de caracteres com uma matriz de caracteres.Note that you do not use the new operator to create a string object except when initializing the string with an array of chars.

Inicialize uma cadeia de caracteres com o valor constante Empty para criar um novo objeto String cuja cadeia de caracteres tem comprimento zero.Initialize a string with the Empty constant value to create a new String object whose string is of zero length. A representação de cadeia de caracteres literal de uma cadeia de caracteres de comprimento zero é "".The string literal representation of a zero-length string is "". Ao inicializar cadeias de caracteres com o valor Empty em vez de nulo, você poderá reduzir as chances de uma NullReferenceException ocorrer.By initializing strings with the Empty value instead of null, you can reduce the chances of a NullReferenceException occurring. Use o método estático IsNullOrEmpty(String) para verificar o valor de uma cadeia de caracteres antes de tentar acessá-la.Use the static IsNullOrEmpty(String) method to verify the value of a string before you try to access it.

Imutabilidade de objetos de cadeia de caracteresImmutability of String Objects

Objetos de cadeia de caracteres são imutáveis: não pode ser alterados após serem criados.String objects are immutable: they cannot be changed after they have been created. Todos os métodos String e operadores C# que aparecem para modificar uma cadeia de caracteres retornam, na verdade, os resultados em um novo objeto de cadeia de caracteres.All of the String methods and C# operators that appear to modify a string actually return the results in a new string object. No exemplo a seguir, quando o conteúdo de s1 e s2 é concatenado para formar uma única cadeia de caracteres, as duas cadeias de caracteres originais são modificadas.In the following example, when the contents of s1 and s2 are concatenated to form a single string, the two original strings are unmodified. O operador += cria uma nova cadeia de caracteres que tem o conteúdo combinado.The += operator creates a new string that contains the combined contents. Esse novo objeto é atribuído à variável s1, e o objeto original que foi atribuído a s1 é liberado para coleta de lixo, pois nenhuma outra variável contém uma referência a ele.That new object is assigned to the variable s1, and the original object that was assigned to s1 is released for garbage collection because no other variable holds a reference to it.

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new
// string object and stores it in s1, releasing the
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.

Como uma cadeia de caracteres de "modificação" na verdade é uma nova criação de cadeia de caracteres, você deve ter cuidado ao criar referências em cadeias de caracteres.Because a string "modification" is actually a new string creation, you must use caution when you create references to strings. Se você criar uma referência a uma cadeia de caracteres e "modificar" a cadeia de caracteres original, a referência continuará apontar para o objeto original em vez do novo objeto que foi criado quando a cadeia de caracteres foi modificada.If you create a reference to a string, and then "modify" the original string, the reference will continue to point to the original object instead of the new object that was created when the string was modified. O código a seguir ilustra esse comportamento:The following code illustrates this behavior:

string s1 = "Hello ";
string s2 = s1;
s1 += "World";

System.Console.WriteLine(s2);
//Output: Hello

Para saber mais sobre como criar novas cadeias de caracteres que se baseiam em modificações, como operações de pesquisa e substituição na cadeia de caracteres original, confira Como modificar o conteúdo da cadeia de caracteres.For more information about how to create new strings that are based on modifications such as search and replace operations on the original string, see How to: Modify String Contents.

Literais de cadeia de caracteres regulares e textuaisRegular and Verbatim String Literals

Use literais de cadeia de caracteres regulares quando você precisar inserir caracteres de escape fornecidos por C#, conforme mostrado no seguinte exemplo:Use regular string literals when you must embed escape characters provided by C#, as shown in the following example:

string columns = "Column 1\tColumn 2\tColumn 3";
//Output: Column 1        Column 2        Column 3

string rows = "Row 1\r\nRow 2\r\nRow 3";
/* Output:
  Row 1
  Row 2
  Row 3
*/

string title = "\"The \u00C6olean Harp\", by Samuel Taylor Coleridge";
//Output: "The Æolean Harp", by Samuel Taylor Coleridge

Use cadeias de caracteres textuais para conveniência e para facilitar a leitura quando o texto da cadeia de caracteres contiver caracteres de barra invertida, por exemplo, em caminhos de arquivo.Use verbatim strings for convenience and better readability when the string text contains backslash characters, for example in file paths. Como as cadeias de caracteres textuais preservam os caracteres de nova linha como parte do texto da cadeia de caracteres, podem ser usadas para inicializar cadeias de caracteres de várias linhas.Because verbatim strings preserve new line characters as part of the string text, they can be used to initialize multiline strings. Use aspas duplas para inserir uma marca de aspas simples dentro de uma cadeia de caracteres textual.Use double quotation marks to embed a quotation mark inside a verbatim string. O exemplo a seguir mostra alguns usos comuns para cadeias de caracteres textuais:The following example shows some common uses for verbatim strings:

string filePath = @"C:\Users\scoleridge\Documents\";
//Output: C:\Users\scoleridge\Documents\

string text = @"My pensive SARA ! thy soft cheek reclined
    Thus on mine arm, most soothing sweet it is
    To sit beside our Cot,...";
/* Output:
My pensive SARA ! thy soft cheek reclined
   Thus on mine arm, most soothing sweet it is
   To sit beside our Cot,... 
*/

string quote = @"Her name was ""Sara.""";
//Output: Her name was "Sara."

Sequências de escape de cadeia de caracteresString Escape Sequences

Sequência de escapeEscape sequence Nome do caractereCharacter name Codificação UnicodeUnicode encoding
\'\' Aspas simplesSingle quote 0x00270x0027
\"\" Aspas duplasDouble quote 0x00220x0022
\\ Barra invertidaBackslash 0x005C0x005C
\0\0 NuloNull 0x00000x0000
\a\a AlertaAlert 0x00070x0007
\b\b BackspaceBackspace 0x00080x0008
\f\f Avanço de páginaForm feed 0x000C0x000C
\n\n Nova linhaNew line 0x000A0x000A
\r\r Retorno de carroCarriage return 0x000D0x000D
\t\t Tabulação horizontalHorizontal tab 0x00090x0009
\U\U Sequência de escape Unicode para pares substitutos.Unicode escape sequence for surrogate pairs. \Unnnnnnnn\Unnnnnnnn
\u\u Sequência de escape UnicodeUnicode escape sequence \u0041 = "A"\u0041 = "A"
\v\v Tabulação verticalVertical tab 0x000B0x000B
\x\x Sequência de escape Unicode semelhante a "\u", exceto pelo comprimento variável.Unicode escape sequence similar to "\u" except with variable length. \x0041 = "A"\x0041 = "A"

Observação

Em tempo de compilação, cadeias de caracteres textuais são convertidas em cadeias de caracteres comuns com as mesmas sequências de escape.At compile time, verbatim strings are converted to ordinary strings with all the same escape sequences. Portanto, se exibir uma cadeia de caracteres textual na janela de observação do depurador, você verá os caracteres de escape que foram adicionados pelo compilador, não a versão textual do código-fonte.Therefore, if you view a verbatim string in the debugger watch window, you will see the escape characters that were added by the compiler, not the verbatim version from your source code. Por exemplo, a cadeia de caracteres textual @"C:\files.txt" será exibida na janela de inspeção como "C:\\files.txt".For example, the verbatim string @"C:\files.txt" will appear in the watch window as "C:\\files.txt".

Cadeias de caracteres de formatoFormat Strings

Uma cadeia de caracteres de formato é aquela cujo conteúdo pode ser determinado dinamicamente no tempo de execução.A format string is a string whose contents can be determined dynamically at runtime. Você cria uma cadeia de caracteres de formato usando o método estático Format e inserindo espaços reservados entre chaves que serão substituídos por outros valores no tempo de execução.You create a format string by using the static Format method and embedding placeholders in braces that will be replaced by other values at runtime. O exemplo a seguir usa uma cadeia de caracteres de formato para o resultado de cada iteração de um loop de saída:The following example uses a format string to output the result of each iteration of a loop:

class FormatString
{
    static void Main()
    {
        // Get user input.
        System.Console.WriteLine("Enter a number");
        string input = System.Console.ReadLine();

        // Convert the input string to an int.
        int j;
        System.Int32.TryParse(input, out j);

        // Write a different string each iteration.
        string s;
        for (int i = 0; i < 10; i++)
        {
            // A simple format string with no alignment formatting.
            s = System.String.Format("{0} times {1} = {2}", i, j, (i * j));
            System.Console.WriteLine(s);
        }

        //Keep the console window open in debug mode.
        System.Console.ReadKey();
    }
}

Uma sobrecarga do método WriteLine usa uma cadeia de caracteres de formato como parâmetro.One overload of the WriteLine method takes a format string as a parameter. Portanto, você pode inserir apenas uma cadeia de caracteres de formato literal sem uma chamada explícita ao método.Therefore, you can just embed a format string literal without an explicit call to the method. No entanto, se usar o método WriteLine para exibir a saída de depuração na janela de Saída do Visual Studio, você precisará chamar explicitamente o método Format, uma vez que WriteLine só aceita uma cadeia de caracteres e não uma cadeia de caracteres de formato.However, if you use the WriteLine method to display debug output in the Visual Studio Output window, you have to explicitly call the Format method because WriteLine only accepts a string, not a format string. Para saber mais sobre cadeias de caracteres de formato, confira Tipos de formatação.For more information about format strings, see Formatting Types.

Subcadeias de caracteresSubstrings

Uma subcadeia de caracteres é qualquer sequência de caracteres contida em uma cadeia de caracteres.A substring is any sequence of characters that is contained in a string. Use o método Substring para criar uma nova cadeia de caracteres com base em uma parte da cadeia de caracteres original.Use the Substring method to create a new string from a part of the original string. Você pode pesquisar uma ou mais ocorrências de uma subcadeia de caracteres usando o método IndexOf.You can search for one or more occurrences of a substring by using the IndexOf method. Use o método Replace para substituir todas as ocorrências de uma subcadeia de caracteres especificada por uma nova cadeia de caracteres.Use the Replace method to replace all occurrences of a specified substring with a new string. Como o método Substring, Replace retorna, na verdade, uma nova cadeia de caracteres e não a modifica a cadeia de caracteres original.Like the Substring method, Replace actually returns a new string and does not modify the original string. Saiba mais em Como pesquisar cadeias de caracteres e Como modificar o conteúdo da cadeia de caracteres.For more information, see How to: search strings and How to: Modify String Contents.

string s3 = "Visual C# Express";
System.Console.WriteLine(s3.Substring(7, 2));
// Output: "C#"

System.Console.WriteLine(s3.Replace("C#", "Basic"));
// Output: "Visual Basic Express"

// Index values are zero-based
int index = s3.IndexOf("C");
// index = 7

Acesso a caracteres individuaisAccessing Individual Characters

Você pode usar a notação de matriz com um valor de índice para adquirir acesso somente leitura a caracteres individuais, como no seguinte exemplo:You can use array notation with an index value to acquire read-only access to individual characters, as in the following example:

string s5 = "Printing backwards";

for (int i = 0; i < s5.Length; i++)
{
    System.Console.Write(s5[s5.Length - i - 1]);
}
// Output: "sdrawkcab gnitnirP"

Se os métodos String não fornecerem a funcionalidade necessária para modificar caracteres individuais em uma cadeia de caracteres, você poderá usar um objeto StringBuilder para modificar os caracteres individuais "in-loco" e criar uma nova cadeia de caracteres para armazenar os resultados usando os métodos StringBuilder.If the String methods do not provide the functionality that you must have to modify individual characters in a string, you can use a StringBuilder object to modify the individual chars "in-place", and then create a new string to store the results by using the StringBuilder methods. No exemplo a seguir, suponha que você deva modificar a cadeia de caracteres original de uma maneira específica e armazenar os resultados para uso futuro:In the following example, assume that you must modify the original string in a particular way and then store the results for future use:

string question = "hOW DOES mICROSOFT wORD DEAL WITH THE cAPS lOCK KEY?";
System.Text.StringBuilder sb = new System.Text.StringBuilder(question);

for (int j = 0; j < sb.Length; j++)
{
    if (System.Char.IsLower(sb[j]) == true)
        sb[j] = System.Char.ToUpper(sb[j]);
    else if (System.Char.IsUpper(sb[j]) == true)
        sb[j] = System.Char.ToLower(sb[j]);
}
// Store the new string.
string corrected = sb.ToString();
System.Console.WriteLine(corrected);
// Output: How does Microsoft Word deal with the Caps Lock key?            

Cadeias de caracteres nulas e cadeias de caracteres vaziasNull Strings and Empty Strings

Uma cadeia de caracteres vazia é uma instância de um objeto System.String que contém zero caractere.An empty string is an instance of a System.String object that contains zero characters. As cadeias de caracteres vazias geralmente são usadas em vários cenários de programação para representar um campo de texto em branco.Empty strings are used often in various programming scenarios to represent a blank text field. Você pode chamar métodos em cadeias de caracteres vazias porque eles são objetos System.String válidos.You can call methods on empty strings because they are valid System.String objects. As cadeias de caracteres vazias são inicializadas da seguinte maneira:Empty strings are initialized as follows:

string s = String.Empty;  

Por outro lado, uma cadeia de caracteres nula não se refere a uma instância de um objeto System.String e qualquer tentativa de chamar um método em uma cadeia de caracteres nula provocará uma NullReferenceException.By contrast, a null string does not refer to an instance of a System.String object and any attempt to call a method on a null string causes a NullReferenceException. No entanto, você pode usar cadeias de caracteres nulas em operações de comparação e concatenação com outras cadeias de caracteres.However, you can use null strings in concatenation and comparison operations with other strings. Os exemplos a seguir ilustram alguns casos em que uma referência a uma cadeia de caracteres nula faz e não faz com que uma exceção seja lançada:The following examples illustrate some cases in which a reference to a null string does and does not cause an exception to be thrown:

static void Main()
{
    string str = "hello";
    string nullStr = null;
    string emptyStr = String.Empty;

    string tempStr = str + nullStr;
    // Output of the following line: hello
    Console.WriteLine(tempStr);

    bool b = (emptyStr == nullStr);
    // Output of the following line: False
    Console.WriteLine(b);

    // The following line creates a new empty string.
    string newStr = emptyStr + nullStr;

    // Null strings and empty strings behave differently. The following
    // two lines display 0.
    Console.WriteLine(emptyStr.Length);
    Console.WriteLine(newStr.Length);
    // The following line raises a NullReferenceException.
    //Console.WriteLine(nullStr.Length);

    // The null character can be displayed and counted, like other chars.
    string s1 = "\x0" + "abc";
    string s2 = "abc" + "\x0";
    // Output of the following line: * abc*
    Console.WriteLine("*" + s1 + "*");
    // Output of the following line: *abc *
    Console.WriteLine("*" + s2 + "*");
    // Output of the following line: 4
    Console.WriteLine(s2.Length);
}

Uso do StringBuilder para a criação rápida de cadeias de caracteresUsing StringBuilder for Fast String Creation

As operações de cadeia de caracteres no .NET são altamente otimizadas e, na maioria dos casos, não afetam o desempenho de forma significativa.String operations in .NET are highly optimized and in most cases do not significantly impact performance. No entanto, em alguns cenários, como loops rígidos que são executados centenas ou milhares de vezes, as operações de cadeia de caracteres podem afetar o desempenho.However, in some scenarios such as tight loops that are executing many hundreds or thousands of times, string operations can affect performance. A classe StringBuilder cria um buffer de cadeia de caracteres que oferece desempenho melhor se o programa executa várias manipulações de cadeia de caracteres.The StringBuilder class creates a string buffer that offers better performance if your program performs many string manipulations. A cadeia de caracteres StringBuilder também permite reatribuir caracteres individuais, o que o tipo de dados String interno não dá suporte.The StringBuilder string also enables you to reassign individual characters, something the built-in string data type does not support. Esse código, por exemplo, altera o conteúdo de uma cadeia de caracteres sem criar uma nova cadeia de caracteres:This code, for example, changes the content of a string without creating a new string:

System.Text.StringBuilder sb = new System.Text.StringBuilder("Rat: the ideal pet");
sb[0] = 'C';
System.Console.WriteLine(sb.ToString());
System.Console.ReadLine();

//Outputs Cat: the ideal pet

Neste exemplo, um objeto StringBuilder é usado para criar uma cadeia de caracteres com base em um conjunto de tipos numéricos:In this example, a StringBuilder object is used to create a string from a set of numeric types:

class TestStringBuilder
{
    static void Main()
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        // Create a string composed of numbers 0 - 9
        for (int i = 0; i < 10; i++)
        {
            sb.Append(i.ToString());
        }
        System.Console.WriteLine(sb);  // displays 0123456789

        // Copy one character of the string (not possible with a System.String)
        sb[0] = sb[9];

        System.Console.WriteLine(sb);  // displays 9123456789
    }
}

Cadeias de caracteres, métodos de extensão e LINQStrings, Extension Methods and LINQ

Uma vez que o tipo String implementa IEnumerable<T>, você pode usar os métodos de extensão definidos na classe Enumerable em cadeias de caracteres.Because the String type implements IEnumerable<T>, you can use the extension methods defined in the Enumerable class on strings. Para evitar a desordem visual, esses métodos são excluídos do IntelliSense para o tipo String, mas estão disponíveis mesmo assim.To avoid visual clutter, these methods are excluded from IntelliSense for the String type, but they are available nevertheless. Você também pode usar expressões LINQLINQ em cadeias de caracteres de consulta.You can also use LINQLINQ query expressions on strings. Para saber mais, confira LINQ e cadeias de caracteres.For more information, see LINQ and Strings.

TópicoTopic DescriçãoDescription
Como modificar o conteúdo de uma cadeia de caracteresHow to: Modify String Contents Ilustra as técnicas para transformar cadeias de caracteres e modificar o conteúdo delas.Illustrates techniques to transform strings and modify the contents of strings.
Como comparar cadeias de caracteresHow to: Compare Strings Mostra como executar comparações ordinais e específicas da cultura de cadeias de caracteres.Shows how to perform ordinal and culture specific comparisons of strings.
Como analisar cadeias de caracteres usando String.Split How to: Parse Strings Using String.Split Contém um exemplo que ilustra como usar o método String.Split para analisar cadeias de caracteres.Contains a code example that illustrates how to use the String.Split method to parse strings.
Como pesquisar cadeias de caracteresHow to: Search Strings Explica como usar a pesquisa para texto específico ou padrões em cadeias de caracteres.Explains how to use search for specific text or patterns in strings.
Como determinar se uma cadeia de caracteres representa um valor numéricoHow to: Determine Whether a String Represents a Numeric Value Mostra como analisar com segurança uma cadeia de caracteres para ver se ela tem um valor numérico válido.Shows how to safely parse a string to see whether it has a valid numeric value.
Como converter uma cadeia de caracteres em um DateTimeHow to: Convert a String to a DateTime Mostra como converter uma cadeia de caracteres como "24/01/2008" em um objeto System.DateTime.Shows how to convert a string such as "01/24/2008" to a System.DateTime object.
Operações básicas de cadeias de caracteresBasic String Operations Fornece links para tópicos que usam os métodos System.String e System.Text.StringBuilder para executar operações básicas de cadeia de caracteres.Provides links to topics that use System.String and System.Text.StringBuilder methods to perform basic string operations.
Análise de cadeias de caracteresParsing Strings Descreve como inserir caracteres ou espaços vazios em uma cadeia de caracteres.Describes how to insert characters or empty spaces into a string.
Comparação de cadeias de caracteresComparing Strings Inclui informações sobre como comparar cadeias de caracteres e fornece exemplos em C# e Visual Basic.Includes information about how to compare strings and provides examples in C# and Visual Basic.
Uso da classe StringBuilderUsing the StringBuilder Class Descreve como criar e modificar objetos de cadeia de caracteres dinâmica usando a classe StringBuilder.Describes how to create and modify dynamic string objects by using the StringBuilder class.
LINQ e Cadeias de CaracteresLINQ and Strings Fornece informações sobre como executar várias operações de cadeia de caracteres usando consultas LINQ.Provides information about how to perform various string operations by using LINQ queries.
Guia de Programação em C#C# Programming Guide Fornece links para tópicos que explicam as construções de programação em C#.Provides links to topics that explain programming constructs in C#.