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.
Este tutorial ensina sobre como criar tipos em C#. Você escreve pequenas quantidades de código e, em seguida, compila e executa esse código. O tutorial contém uma série de lições que exploram diferentes tipos de tipos em C#. Estas lições ensinam os fundamentos da linguagem C#.
Sugestão
Quando um bloco de trecho de código inclui o botão "Executar", esse botão abre a janela interativa ou substitui o código existente na janela interativa. Quando o trecho não inclui um botão "Executar", você pode copiar o código e adicioná-lo à janela interativa atual.
Os tutoriais anteriores trabalhavam com texto e números. Strings e Numbers são tipos simples: cada um armazena um único valor. À medida que seus programas crescem, você precisa trabalhar com estruturas de dados mais sofisticadas. O C# fornece diferentes tipos de tipos que você pode definir quando precisar de estruturas de dados com mais campos, propriedades ou comportamento. Vamos começar a explorar esses tipos.
Tuplas
As tuplas são uma sequência ordenada de valores com um comprimento fixo. Cada elemento de uma tupla tem um tipo e um nome opcional. O código a seguir declara uma tupla que representa um ponto 2D. Selecione o botão "Executar" para colar o seguinte código na janela interativa e executá-lo.
var pt = (X: 1, Y: 2);
var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");
Sugestão
Ao explorar C# (ou qualquer linguagem de programação), você comete erros ao escrever código. O compilador encontra esses erros e os relata para você. Quando a saída contiver mensagens de erro, observe atentamente o código de exemplo e o código na janela interativa para ver o que corrigir. Esse exercício ajuda você a aprender a estrutura do código C#.
Você pode reatribuir qualquer membro de uma tupla. Adicione o seguinte código na janela interativa após o código existente. Pressione "Executar" novamente para ver os resultados.
pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");
Você também pode criar uma nova tupla que é uma cópia modificada do original usando uma with expressão. Adicione o seguinte código após o código já na janela interativa e pressione "Executar" para ver os resultados:
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");
A tupla pt2 contém o X valor de pt (6) e pt2.Y é 10.
As tuplas são tipos estruturais. Em outras palavras, os tipos de tupla não têm nomes como string ou int. Um tipo de tupla é definido pelo número de membros, referido como aridade, e os tipos desses membros. Os nomes dos membros são por conveniência. Você pode atribuir uma tupla a uma tupla com a mesma aridade e tipos, mesmo que os membros tenham nomes diferentes. Você pode adicionar o seguinte código após o código que você já escreveu na janela interativa e experimentá-lo:
var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);
A variável subscript tem dois membros, ambos inteiros. Ambos subscript e pt representam instâncias do mesmo tipo de tupla: uma tupla contendo 2 int membros.
Tuplas são fáceis de criar: você declara vários membros entre parênteses. Todos os seguintes declaram diferentes tuplas de diferentes aridades e tipos de membros. Adicione o seguinte código para criar novos tipos de tupla:
var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);
As tuplas são fáceis de criar, mas são limitadas em suas capacidades. Os tipos de tupla não têm nomes, então você não pode transmitir significado para o conjunto de valores. Os tipos de tupla não podem adicionar comportamento. C# tem outros tipos de tipos que você pode criar quando seu tipo define comportamento.
Criar tipos de registro
As tuplas são ótimas para aqueles momentos em que você quer vários valores na mesma estrutura. Eles são leves e podem ser declarados à medida que são usados. À medida que o teu programa se desenvolve, podes achar que utilizas o mesmo tipo de tupla em todo o teu código. Se o seu aplicativo funcionar no espaço do gráfico 2D, as tuplas que representam pontos podem ser comuns. Depois de descobrir isso, você pode declarar um record tipo que armazena esses valores e fornece mais recursos. O exemplo de código a seguir usa um Main método para representar o ponto de entrada para o programa. Dessa forma, você pode declarar um record tipo que precede o ponto de entrada no código. Pressione o botão "Executar" no código a seguir para substituir o exemplo existente pelo código a seguir.
Advertência
Não copie e cole. A janela interativa deve ser redefinida para executar o exemplo a seguir. Se você cometer um erro, a janela trava e você precisa atualizar a página para continuar.
O código a seguir declara e usa um record tipo para representar um Pointe, em seguida, usa essa Point estrutura no Main método:
public record Point(int X, int Y);
public static void Main()
{
Point pt = new Point(1, 1);
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The two points are {pt} and {pt2}");
}
Uma declaração record é uma única linha de código para o tipo Point que armazena os valores X e Y em propriedades de leitura apenas. Você usa o nome Point onde quer que use esse tipo. Tipos nomeados corretamente, como Point, fornecem informações sobre como o tipo é usado. O Main método mostra como usar uma with expressão para criar um novo ponto que é uma cópia modificada do ponto existente. A linha pt2 = pt with { Y = 10 } diz "pt2 tem os mesmos valores que pt, exceto que Y é atribuído o valor 10". Pode-se adicionar qualquer número de propriedades a serem alteradas numa única expressão with.
A declaração anterior record é uma única linha de código que termina em ;, como todas as instruções C#. Você pode adicionar comportamento a um record tipo declarando membros. Um membro de um registo pode ser uma função ou incluir mais elementos de dados. Os membros de um tipo estão na declaração de tipo, entre { e } caracteres. Substitua a declaração de registro feita pelo seguinte código:
public record Point(int X, int Y)
{
public double Slope() => (double)Y / (double)X;
}
Em seguida, adicione o seguinte código ao Main método após a linha que contém a with expressão:
double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");
Você acrescentou formalidade à tupla representando um X e Y valor. Você fez um record que definiu um tipo nomeado e incluiu um membro para calcular a inclinação. Um record tipo é uma abreviação de record class: um class tipo que inclui comportamento extra. Você pode modificar o Point tipo para torná-lo um record struct também:
public record struct Point(int X, int Y)
{
public double Slope() => (double) Y / (double) X;
}
A record struct é um struct tipo que inclui o comportamento extra adicionado a todos os record tipos.
Tipos de estrutura, classe e interface
Todos os tipos nomeados em C# são ou do tipo class ou struct. A class é um tipo de referência. A struct é um tipo de valor. As variáveis de um tipo de valor armazenam o conteúdo da instância diretamente na memória. Em outras palavras, um record struct Point armazena dois inteiros: X e Y. As variáveis de um tipo de referência armazenam uma referência ou um ponteiro para a memória onde está a instância. Em outras palavras, um record class Point armazena uma referência a um bloco de memória que contém os valores para X e Y.
Na prática, isso significa que os tipos de valor são copiados quando atribuídos, mas uma cópia de uma instância de classe é uma cópia da referência. Essa referência copiada refere-se à mesma instância de um ponto, com o mesmo armazenamento para X e Y.
O record modificador instrui o compilador a escrever vários membros para você. Você pode saber mais no artigo sobre tipos de registro na seção de fundamentos.
Ao declarar um record tipo, você declara que seu tipo deve usar um conjunto padrão de comportamentos para comparações de igualdade, atribuição e cópia de instâncias desse tipo. Os registros são a melhor escolha quando o armazenamento de dados relacionados é a principal responsabilidade do seu tipo. À medida que se adicionam mais comportamentos, considere usar tipos struct ou class, sem o modificador record.
Você usa struct tipos para tipos de valor quando um comportamento mais sofisticado é necessário, mas a principal responsabilidade é armazenar valores. Você usa class tipos para usar expressões idiomáticas orientadas a objetos como encapsulamento, herança e polimorfismo.
Você também pode definir interface tipos para declarar contratos comportamentais que diferentes tipos devem implementar. Ambos os tipos struct e class podem implementar interfaces.
Normalmente, você usa todos esses tipos em programas e bibliotecas maiores. Depois de instalar o SDK do .NET, você pode explorar esses tipos usando tutoriais sobre classes na seção de fundamentos.
Você concluiu o tutorial interativo "Criar tipos em C#". Você pode selecionar o link Branches and Loops para iniciar o próximo tutorial interativo ou pode visitar o site do .NET para baixar o SDK do .NET, criar um projeto em sua máquina e continuar codificando. A secção "Próximos passos" traz-o de volta a estes tutoriais.
Você pode saber mais sobre tipos em C# nos seguintes artigos: