Trabalhando com strings
📽 Veja esta vídeo-aula no Youtube
O básico
Uma string é uma cadeia (sequência, arranjo) de caracteres individuais. Por exemplo, a string Etec é formada pelos caracteres E, t, e e c. No .NET, por padrão, é utilizada a codificação UTF-16.
Para definir uma string em C# utilizamos as aspas duplas (").
Você já conheceu as strings quando estudou o comando Console.WriteLine:
Console.WriteLine("Etec Adolpho Berezin");
Nesse exemplo, a string é definida em "Etec Adolpho Berezin" e passada como argumento para o método Console.WriteLine.
Podemos armazenar uma string em memória utilizando variáveis do tipo string:
string nome = "Ermogenes";
string sobrenome = "Palacio";
Concatenação
Digamos que agora queremos uma variável contendo o nome completo. Precisamos instruir o computador a juntar os conteúdos das variáveis. Esse processo pode ser feito de várias maneiras. Vejamos:
- Concatenação via operador
+
string nomeCompleto = nome + " " + sobrenome;
- Concatenação via método
Concat
string nomeCompleto = String.Concat(nome, " ", sobrenome);
- Formatação de composição
string nomeCompleto = String.Format("{0} {1}", nome, sobrenome);
- Interpolação
string nomeCompleto = $"{nome} {sobrenome}";
- Objeto auxiliar (Buffer)
using System.Text;
// ...
StringBuilder nomeCompletoBuffer = new();
nomeCompletoBuffer.Append(nome);
nomeCompletoBuffer.AppendFormat(" {0}", sobrenome);
string nomeCompleto = nomeCompletoBuffer.ToString();
Interpolação e formatação de composição
Podemos alinhar as strings ao interpolar, bem como indicar algumas formatações simples nos valores (chamadas de formatação de composição).
Sintaxe:
{expressão,alinhamento:formatação}
Alinhamentos:
| Entrada | alinhamento |
Saída | Explicação |
|---|---|---|---|
abc |
10 |
•••••••abc |
A saída terá 10 caracteres, com a entrada alinhada à direita |
abc |
-10 |
abc••••••• |
A saída terá 10 caracteres, com a entrada alinhada à esquerda |
Caso o valor seja maior do que o tamanho especificado, o alinhamento é ignorado.
Formatações:
| Entrada | formatação |
Saída | Explicação |
|---|---|---|---|
2124.5 |
C |
R$ 2.124,50 |
Formatação de moeda, na cultura atual do sistema operacional |
2124.5 |
N4 |
2.124,5000 |
Saída numérica formatada como número da cultura atual, com 4 casas decimais |
0,3982 |
P1 |
39,8 % |
Saída numérica multiplicada por 100, com uma casa decimal, seguida do caractere % |
Conversão para string
Todos os objetos de C# possuem um método para conversão do seu valor em string, chamado .ToString(). Caso não haja uma representação humanamente legível adequada, será retornado o tipo do objeto.
Cada tipo pode disponibilizar parametrizações para personalizar a saída. Muitos deles (mas nem todos) aceitam a formatação de composição.
192.ToString("N4") // Retorna 192,0000
Também é possível a conversão de inteiros para string usando a classe Convert, onde pode ser definida a base numérica a ser utilizada:
Convert.ToString(192, 2) // "11000000", que é a representação de 192 em binário
Convert.ToString(192, 8) // "300", que é a representação de 192 em octal
Convert.ToString(192, 16) // "c0", que é a representação de 192 em hexadecimal
Opções úteis em System.String
-
Resultam em uma string
Insertinsere uma cadeia de caracteres na string atual.PadLeftinsere uma ou mais ocorrências de um caractere especificado no início de uma string.PadRightinsere uma ou mais ocorrências de um caractere especificado no final de uma string.Removeexclui uma subcadeia de caracteres da string.Replacesubstitui uma subcadeia de caracteres por outra subcadeia de caracteres na string.Substringobtém partes de uma string de acordo com sua posiçãoSubstring(x, y)retorna osypróximos caracteres na string iniciando na posiçãoxSubstring(z)retorna todos os caracteres da string a partir da posiçãozaté o final
ToLowerconverte todos os caracteres em uma string em minúsculas.ToUpperconverte todos os caracteres em uma string em letras maiúsculas.Trimremove todas as ocorrências de um caractere do início e do fim de uma string.TrimEndremove todas as ocorrências de um caractere do final de uma string.TrimStartremove todas as ocorrências de um caractere do início de uma string.
Exemplo de ToUpper e ToLower
Console.WriteLine($"{nome.ToUpper()} {sobrenome.ToLower()}")
Resultado:
ERMOGENES palacio
Outros exemplos:
"abcdef".Insert(3, " :) ") // "abc :) def"
"123".PadLeft(10, '.') // ".......123"
"123".PadRight(10, '.') // "123......."
"abcdefghij".Remove(5) // "abcde"
"abcdefghij".Remove(5, 2) // "abcdehij"
"bala".Replace("a", "o") // "bolo"
"abcdefghij".Substring(0, 5) // "abcde"
"abcdefghij".Substring(5) // "fghij"
"AbCdeF".ToLower() // "abcdef"
"AbCdeF".ToUpper() // "ABCDEF"
" 123 ".Trim() // "123"
" 123 ".TrimEnd() // " 123"
" 123 ".TrimStart() // "123 "
-
Resultam em um número
Lengthretorna o número de caracteres contidos na stringIndexOfretorna o índice da primeira ocorrência de uma string em outraLastIndexOfretorna o índice da última ocorrência de uma string em outra
"veneno".Length // 6
"veneno".IndexOf("en") // 1
"veneno".LastIndexOf("en") // 3
"veneno".IndexOf("xyz") // -1 (não encontrado)
-
Resultam em um booleano
Equalscompara a igualdade de duas stringsContainsbusca se uma string existe dentro de outraEndsWithretorna se uma string termina em outraStartsWithretorna se uma string começa em outra
"abc".Equals("abc") // True
"abc".Equals("ABC") // False
"abc".Equals("xyz") // False
"etec adolpho berezin".Contains("mongaguá") // False
"etec adolpho berezin".EndsWith("adolpho") // False
"etec adolpho berezin".StartsWith("etec") // True
-
Resultam em um arranjo
Splitsepara a string em elementos de um arranjo de string, a cada ocorrência de outra stringToCharArraycria um arranjo decharcom os caracteres da string
"Amanhã será um novo dia".Split(" ") // new string[] { "Amanhã", "será", "um", "novo", "dia" }
"Etec".ToCharArray() // new char[] { 'E', 't', 'e', 'c' }
-
Opções estáticas
String.Concatconcatena várias strings em uma única string novaString.Formatconcatena várias strings em uma única string nova usando formatação de composiçãoString.Emptyretorna a string vazia""String.IsNullOrEmptyretorna um booleano indicando se a string é nula (null) ou vazia ("")String.Joinconcatena strings contidas em uma lista, separados por uma string indicadaConvert.ToStringconverte um conteúdo em stringConvert.ToString(numero, base)converte um número em uma string representando o número em outra base
<valor>.ToStringconverte valor qualquer em sua representação em string
String.Concat("Etec", "Adolpho", "Berezin") // "EtecAdolphoBerezin"
String.Format("{0} {1} {2}", "Etec", "Adolpho", "Berezin") // "Etec Adolpho Berezin"
String.Empty // ""
String.IsNullOrEmpty("teste") // False
String.IsNullOrEmpty("") // True
String.IsNullOrEmpty(String.Empty) // True
String.IsNullOrEmpty(null) // True
String.Join("... ", new string[] { "Etec", "Adolpho", "Berezin" }) // "Etec... Adolpho... Berezin"
Convert.ToString(true) // "True"
Convert.ToString(192) // "192"
Convert.ToString(192, 2) // "11000000" -> 192 em base 2 (binário)
Convert.ToString(192, 8) // "300" -> 192 em base 8 (octal)
Convert.ToString(192, 16) // "c0" -> 192 em base 16 (hexadecimal)
1500.ToString() // "1500"
As strings podem ser acessadas como um arranjo de char, usando o operador [índice]. O índice indica a posição desejada, iniciando em zero.
"mongaguá"[0] // 'm'
"mongaguá"[3] // 'g'
"mongaguá"[7] // 'á'
"mongaguá"[8] // erro!
Sequências de escape
Digamos que você queira exibir a seguinte citação no console:
"Lágrimas não são argumentos."
Machado de Assis
Mas como podemos exibir o caracteres " (aspas duplas)?
Percebam que teremos um erro se utilizarmos diretamente:
Console.WriteLine(""Lágrimas não são argumentos."");
Console.WriteLine("Machado de Assis");
Isso acontece porque as aspas tem função especial em strings: ser o delimitador.
Para representar em uma string caracteres especiais temos que usar uma sequência equivalente, chamada de escape.
Para armazenar aspas duplas em uma string delimitada por aspas duplas, podemos usar a sequência de escape \".
Console.WriteLine("\"Lágrimas não são argumentos.\"");
Perceba que as aspas delimitadoras continuam normalmente.
Algumas sequências de escape importantes:
| Caracter | Sequência de escape | Um exemplo (string) |
|---|---|---|
" |
\" |
"Ganhar na mega-sena é \"fácil\" demais." |
' |
\' |
"Eu \'prefiro\' aspas simples." |
| (quebra de linha) | \n |
"Oi!\nTchau!" |
| (tabulação) | \t |
"Olá!\tTudo bem?\nSim!\tE você?" |
O C# ignorará todas as sequências de escape se a string for criada com o identificador textual @:
Console.WriteLine(@"Meus projetos estão salvos em c:\Users\ermogenes\Documents\novosProjetos");
Exibirá:
Meus projetos estão salvos em c:\Users\ermogenes\Documents\novosProjetos
Emojis
As strings C# podem armazenar emojis (na maioria dos casos) sem maiores problemas.
string mensagem = "Não faça barulho nas aulas! 🤫";
Infelizmente não conseguimos exibir os emojis em aplicações do tipo console (mas nada nos impede de exibir em uma página web ou app mobile).
Listas de emojis:
Você pode copiar o emoji e colar no VsCode.
Tipo char
Representa um caractere Unicode UTF-16. É o componente formador de uma string.
Podemos criar um char de diversas maneiras:
char letraJotaMinuscula = 'j'; // = [j], usando um literal entre aspas simples
char cuboDeGelo = '🧊'; // = [🧊], usando um emoji literal entre aspas simples
char espacoEmBranco = (char)32; // = [ ], usando o número inteiro equivalente
char betaGrego = '\u03B2'; // = [β], usando o código UTF-16
char aguaChines = '\x6C34'; // = [水], usando o valor hexadecimal
Strings podem ser convertidos em arranjos de char (usando .ToCharArray()) e vice-versa (usando String.Join).