# Entity Framework C# (Português de Portugal) Data: 09-01-2025 13: 48: 40 ## Lista de Vídeos 1. [O Que É C#? | O Que É o Linguagem de Programação C#? | C# Tutorial para iniciantes | Simplilearn](https://www.youtube.com/watch?v=BcMQavJd-tY) 2. [C# Básicos | C# para iniciantes | O Que É a Linguagem de Programação C# | C# Tutorial | Simplilearn](https://www.youtube.com/watch?v=Z3EpnGi52tE) 3. [C# Tipos primitivos e Variáveis | Literais de Datatype e Variáveis em C# | C# Tutorial | Simplilearn](https://www.youtube.com/watch?v=rS2rGqW9pPM) 4. [C# OOPS | Programação Orientada a Objetos em C# | C# Tutorial para iniciantes | Simplilearn](https://www.youtube.com/watch?v=iA0XZwFqqKI) 5. [Coleções em C# Explicadas | Coleções em C# para iniciantes | C# Tutorial | Simplilearn](https://www.youtube.com/watch?v=j9N2YOyInRE) 6. [C# Árvores e Grafos Explicados | Estruturas de Dados e Algoritimos em C# | C# Tutorial | Simplilearn](https://www.youtube.com/watch?v=IqQ7QpmiBJ0) 7. [Dicionário, Tabelas Hash e Conjuntos em C# | Estruturas de Dados em C# Explicadas | C# Tutorial | Simplilearn](https://www.youtube.com/watch?v=iJRx3vs1v54) 8. [Async Await em C# | Async Await em C# Explicado com exemplo | C# Tutorial para iniciantes | Simplilearn](https://www.youtube.com/watch?v=B8n-a2qS4Gg) 9. [C# Wait Explicado | Exemplo de Wait em C# | Tutorial de Wait Task em C# para iniciantes | Simplilearn](https://www.youtube.com/watch?v=KezYq745G64) 10. [C# MVC CRUD Tutorial | Operações CRUD completas em Asp. net MVC usando Entity Framework | Simplilearn](https://www.youtube.com/watch?v=xFeDCD4si3U) 11. [C# REST API Tutorial | REST API em C# | Tutorial de REST API para iniciantes | C# Tutorial | Simplilearn](https://www.youtube.com/watch?v=BqDvnDQoMVo) 12. [C# Web Services Tutorial | Web Services C# Explicados | Tutorial de Web Services para iniciantes | Simplilearn](https://www.youtube.com/watch?v=cb1_HrhYodI) 13. [C# Web API Tutorial | O Que é Web API em C#? | Tutorial de C# | Tutorial de Programação de C# para iniciantes | Simplilearn](https://www.youtube.com/watch?v=Ic_bviHY3Qo) 14. [C# Padrões de Projeto | Tutorial de Padrões de Projeto para iniciantes | Tutorial de Programação de C# para iniciantes | Simplilearn](https://www.youtube.com/watch?v=OP1tBC6dBW0) 15. [C# Injeção de Dependência Tutorial | Exemplo de Injeção de Dependência em C# | Tutorial de C# para iniciantes | Simplilearn](https://www.youtube.com/watch?v=GRLidsP3O2M) 16. [C# Delegates Explicados | Delegates e Eventos em C# Tutorial | Exemplo de Delegates em C# | Simplilearn](https://www.youtube.com/watch?v=vOlLd2SsKM4) 17. [Tutorial do C# sobre Lambda Expressions | LING C# | C# Tutorial para iniciantes | Simplilearn](https://www.youtube.com/watch?v=K_62nX2z5As) 18. [Tutorial de C# sobre laços | Lazos em C# | Comandos de Iteração em C# | C# 101](https://www.youtube.com/watch?v=K_fotFf9xaQ) 19. [Linq C# Tutorial | LINQ para consultas em C# | C# Para Iniciantes | Simplilearn](https://www.youtube.com/watch?v=D8db7Zg630Q) 20. [Tutorial sobre Streams em C# | Streams em C# explicados | C# Para Iniciantes | Simplilearn](https://www.youtube.com/watch?v=2KUV-cctyv0) ```markdown # Visual Studio em Sistema Operativo Windows Este texto discute o calendário para uma sessão de aprendizado do C#, linguagem de programação. A sessão aborda diversos tópicos, incluindo a história do C#, tipos de dados, variáveis, operadores, declarações condicionais, arrays, strings, funções, coleções, enumerações, programação orientada a objetos, modificadores de acesso, operações de arquivos, tratamento de exceções e novas funcionalidades no C#. ## História do C# O C# é uma linguagem de programação orientada a objetos fornecida pela Microsoft que executa em um framework. Anders Heilsberg foi a primeira pessoa a criá-lo, **Aprendendo** a introdução da linguagem C, **seu uso** e por que usar o C#. **C#** é uma linguagem orientada a objetos que executa no framework . NET. Ela tem raízes na família C e está relacionada a outras linguagens de programação populares como Java e C++. No ano de 2002, a primeira versão foi lançada. A versão mais recente, C# versão 8, foi lançada em setembro de 2019. C# é utilizado em diversos campos, **incluindo aplicativos móveis**, **aplicativos de escritório**, **aplicações web**, **serviços web**, **sites**, **jogos**, **aplicações de banco de dados** e **realidade virtual**. ## Tipos de Dados no C# Os tipos de dados no C# podem ser classificados de acordo com a localização da memória: 1. Tipos de valor 2. Tipos de referência 3. Tipos de ponteiro ### Tipos de Valor no C# Um tipo de dado é um tipo de valor se ele pode ser armazenado como valores em sua própria memória. Esses tipos de dados armazenam seus dados ou valor diretamente em uma variável. Exemplos de tipos de dados de valor são: - `boolean` - `byte` - `char` - `decimal` - `double` - `enum` - `float` - `integer` - `long` - `short` - `struct` ### Tipos de Referência no C# Ao contrário de um tipo de valor, um tipo de referência não armazena seu valor diretamente. Em vez disso, ele salva o endereço onde o valor está armazenado. Um exemplo de tipo de referência é `string`. ### Tipos de Ponteiro no C# O tipo de ponteiro no C# é usado para armazenar o endereço de outro ponteiro, e ele é destinado a armazenar o endereço de outro ponteiro. ## Variáveis no C# As variáveis são contêineres de valores de dados em C#. Há vários tipos de variáveis definidos com palavras-chave diferentes, como: - `integer` - `double` - `char` - `string` - `boolean` Para declarar variáveis no C#, **você deve primeiro especificar seu tipo** e atribuir um valor. O sintaxe para declarar variáveis é como segue: ```csharp dataType variableName = value; ``` ## Operadores no C# Os operadores são usados para manipular variáveis e valores em C#. Há quatro tipos de operadores: 1. Operadores automáticos 2. Operadores de atribuição 3. Operadores de comparação 4. Operadores lógicos Vamos passar por **cada um desses** em detalhes. ## Estrutura Básica de um Programa C# A estrutura básica de um programa C# parece assim: # Documentação Técnica em Markdown ## Declarações Condicionais no CSharp ### Declaração IF Se a condição 1 for verdadeira, o bloco de código `if` será executado. Caso a condição 1 seja falsa e a condição 2 verdadeira, o bloco `else if` será executado, e se ambas as condições forem falsas, então o bloco `else` será executado. O diagrama de fluxo para declarações `if-else` em CSharp é o seguinte: ``` Se a Condição 1 for verdadeira Executar bloco de código `if` Caso a Condição 2 seja verdadeira Executar bloco de código `else if` Senão Executar bloco de código `else` ``` ### Declaração de IF Aninhada Uma declaração `if` aninhada é definida como um estatement de programação condicional que inclui outra declaração `if` dentro do `if` anterior. O seguinte é o síntaxe de declaração de `if` aninhada: ``` Se a Condição 1 for verdadeira Executar bloco de código primeiro Se a Condição 2 for verdadeira Executar bloco de código segundo Senão Executar outro bloco de código Senão Executar bloco de código `else` ``` ### Declaração de Condição SWITCH Em CSharp, existe uma declaração `switch` de condição. O `switch` é definido como um `statement` de seleção de programa que testa para uma possível correspondência com as condições fornecidas entre as opções disponíveis. Se nenhuma das opções corresponder, o controle irá executar o `default` do bloco de instruções. O seguinte é o síntaxe de declaração de `switch`: ``` switch (expressão) { case 1: // Código para o caso 1 break; case 2: // Código para o caso 2 break; default: // Comando padrão } ``` ### Laços em CSharp Em CSharp, o `statement` de controle de loop executa uma operação de looping até a condição for atendida. Quando a condição for falsa, o controle é removido dos `statements` de loop. Existem três tipos diferentes de loops em CSharp: 1. **Loop FOR**: ``` for (inicialização; condição; atualização) { // Bloco de código a ser executado } ``` 2. **Loop WHILE**: ``` while (condição) { // Bloco de código a ser executado } ``` 3. **Loop DO-WHILE**: ``` do { // Bloco de código a ser executado } while (condição); ``` ### Arrays em CSharp Um array em CSharp é uma coleção de tamanho fixo de elementos do mesmo tipo de dados. Um array armazena uma coleção de dados, mas é mais útil pensar num array como uma coleção de variáveis do mesmo tipo armazenadas em localidades de memória consecutivas ao invés de declarar variáveis individuais. Para declarar um array em CSharp, você pode utilizar o seguinte síntaxe: ``` Tipo_de_dado[] array_name; ``` ### Inicialização de Arrays em CSharp A declaração de array não causa a inicialização da matriz na memória. Após a inicialização da variável de array, você pode atribuir valores a ela. O síntaxe é o seguinte: ``` Tipo_de_dado[] array_name = new Tipo_de_dado[tamanho]; ``` ### Cadeias de Caracteres em CSharp Em CSharp, uma cadeia de caracteres é uma cadeia de caracteres com o valor texto. O texto é armazenado internamente como uma coleção sequencial leitura-apenas de objetos de caracteres. Porque nenhum caractere nulo está no final de uma cadeia de caracteres em CSharp, ela pode conter qualquer número de caracteres nulos embutidos. ### Métodos em CSharp Em CSharp, um método é uma coleção de instruções que trabalham juntas para concluir uma tarefa. Todo programa em CSharp contém pelo menos uma classe com o método main para usar métodos em CSharp. Para definir um método, você deve executar as seguintes etapas: 1. Definir o método 2. Chamar o método O síntaxe para definir um método é o seguinte: ``` acesso_especificador retorno_tipo metodo_nome(lista_de_parâmetros) { // Código do bloco do método } ``` ### Coleções em CSharp As classes de coleção são classes especiais de armazenamento e recuperação de dados em CSharp. Pilhas, listas, e Hash Tables são apoiados por estas classes. As interfaces de maioria das classes de coleção são as mesmas, e as classes de coleção servem diversas funções como alocar dinamicamente memória para elementos e acessar uma lista de itens via um índice. Algumas classes de coleção em CSharp são: 1. ArrayList 2. Colorado Hash Table 3. Sorted List 4. Pilha 5. Fila 6. BitArray ### Enumerações em CSharp Em CSharp, um `enum` é um tipo de classe que representa uma coleção de restrições, variáveis que não podem ser modificadas ou lidas. Utilize o `enum` `keyword` em vez de `class` ou `interface` para criar um `enum` e separe as itens do `enum` com uma vírgula. O nome desse `enum` é `direção`, e todas as quatro direções, que são **leste**, **oeste**, **norte**, e **sul**, são separados por uma vírgula. ### Programação Orientada a Objetos (POO) em CSharp Programação Orientada a Objetos (POO) é um paradigma de programação baseado no conceito de objetos. Criar procedimentos ou métodos que executam operações em dados é o que a programação procedimental é sobre; em contraste, a POO é sobre a criação de objetos que contêm tanto dados como métodos. A POO possui várias vantagens em relação à programação procedimental, incluindo: - A POO é mais rápida e fácil de implementar. - A POO dá aos programas uma estrutura clara. - A POO ajuda a preservar o código em C# DRY (não repita a si mesmo) e torna mais fácil manter, modificar, e debugar. - A POO permite a criação de aplicações totalmente reutilizáveis com menos código e menor tempo próprio para desenvolvimento. ### Os Quatro Conceitos Fundamentais da Programação Orientada a Objetos em C# 1. **Abstração**: Abstração processa a ocultação dos detalhes internos e apresenta apenas a funcionalidade principal. 2. **Incapsulamento**: O incapsulamento em C# é um processo de agrupamento de membros de dados e funções em uma unidade. 3. **Herança**: Herança é um processo pelo qual um objeto adquire automaticamente todas as propriedades e comportamentos de seu objeto pai. 4. **Polimorfismo**: O polimorfismo é definido como um nome para várias formas; o polimorfismo permite a uma classe ter múltiplas implementações com o mesmo nome. ### Modificadores de Acesso em CSharp Os modificadores de acesso em C# especificam o escopo de acessibilidade de um membro da classe ou de um tipo de classe próprio. O primeiro modificador de acesso é `public`, indicando que o código é acessível a todos os classes. Os seguintes modificadores de acesso são utilizados em C#: - `private`: O código pode ser acessado somente dentro da mesma classe. - `protected`: O código é acessível dentro da mesma classe ou de uma classe herdada desta classe. - `internal`: O código é somente acessível dentro da sua assembléia e não pode ser acessado de outra assembléia. # C# File Handling e Exceção de Manejo | Tutorial C# | Simplilearn Idioma: pt-PT Olá a todos, sou Pepper Khandelwal e bem-vindos a nossa canal de YouTube Simplilearn. Hoje vamos falar sobre dois tópicos importantes em C#: Manejo de Arquivos e Manejo de Exceções. Mas antes de começar, gostaria de dizer a todos que temos atualizações diárias em várias tecnologias, então se você é um entusiasta da tecnologia em busca de avanços tecnológicos constantes, considere se inscrever no nosso canal de YouTube e não esqueça de clicar no ícone de sino para não perder nenhuma atualização no Simplilearn. Agora, vamos começar com a agenda para a sessão de hoje. Começaremos com o Manejo de Arquivos, depois discutiremos as funções de manejo de arquivos em C#, seguido pelo Manejo de Exceções e finalmente termos uma implementação do Manejo de Arquivos e Exceções em C#. ## Manejo de Arquivos em C# O manejo de arquivos é uma parte essencial de qualquer linguagem de programação e o C# fornece várias maneiras de gerenciar arquivos. Aqui estão as cinco funções principais que discutiremos: 1. Função de Anexo: Esta função adiciona texto ao final de um arquivo já existente. 2. Função de Cópia: Esta função duplica o arquivo. 3. Função de Criação: Esta função é usada para criar ou substituir um arquivo. 4. Função de Exclusão: Esta função exclui um arquivo. 5. Função de Existência: Esta função determina se um arquivo existe ou não. 6. Função Ler Todo o Texto: Esta função lê o conteúdo do arquivo. 7. Função de Substituição: Esta função substitui o conteúdo de um arquivo por outro. 8. Função Escrever Todo o Texto: Esta função cria um arquivo e escreve seu conteúdo nele. ## Manejo de Exceções em C# O manejo de exceções é um mecanismo para lidar com erros e exceções que ocorrem durante a execução devido a erros de código ou entrada de usuário inválida. No C#, usamos quatro palavras-chave no manejo de exceções: try, catch, finally e throw. 1. Declaração try: A declaração try permite que você defina uma seção de código que será verificada enquanto ela é executada. 2. Declaração catch: A declaração catch é usada para o manejo de exceções. Se um erro ocorrer no bloco try, ele permite que você defina um bloco de código que será executado. 3. Declaração finally: A declaração finally permite que você execute código após a declaração try, independentemente do resultado do bloco catch. 4. Declaração throw: Você pode definir seu erro usando a declaração throw. Neste vídeo, vamos aprender sobre as novas funcionalidades da linguagem de programação C#. Alguns dos recursos importantes da nova versão de C# incluem: 1. Métodos de Interface por Padrão 2. Referências de Tipo Nulo 3. Melhorias na Pattern Matching 4. Fluxos Assíncronos 5. Uso de Declarações 6. Cadeias de Caracteres Interpoladas 7. Melhorias na Cadeia de Caracteres 8. Atribuição de Nulo 9. Funções Locais Estáticas Coalhidas 10. Índices e suas Faixas 11. Tipos de Construção não Ger # Linguagem de Programação Orienta-Objetos em C#: Princípios de POO No C#, uma linguagem de programação orientada a objetos, é necessário criar uma classe para representar dados. Uma **classe** é um modelo para um objeto que contém variáveis para armazenar dados e métodos para executar operações em particular dados. ## Classes e Objetos Avancemos para o próximo conceito. Cada objeto que você criar terá suas próprias variáveis e métodos para manipular valores armazenados nas variáveis. Neste particular exemplo, considere uma `Car` classe com métodos de início e parada para funções de objetos. Avaçamos para o próximo tópico: Compreendendo os quatro princípios fundamentais de programação orientada a objetos em C# ### Visão Geral A programação orientada a objetos em C# é classificada em quatro princípios fundamentais: 1. Encapsulamento 2. Herança 3. Abstração 4. Polimorfismo ## Encapsulamento em C# O Encapsulamento é o processo de combinar dados e métodos em um único bloco ou classe única. O Encapsulamento é o processo de encluir algo em uma cápsula que contém as operações do objeto e dados particulares neste objeto. ### Exemplo Considerar o exemplo da encapsulação dos métodos para encontrar a área de uma forma geométrica dada. Nesta aplicação particular classe, encapsulamos as funções getArea que calculam a área de um retângulo e as variáveis comprimento e largura também. ## Herança em C# A herança é um conceito importante em programação orientada a objetos em C#. A herança é um conceito por meio do qual a classe pai e a classe filha são definidas. A classe filha herda as métodos e propriedades da classe pai, podendo também alterar o comportamento dos métodos, se necessário. Se necessário, a classe filha pode definir seus próprios métodos. Aqui está uma representação pictórica da herança: [Diagrama de Herança] ### Exemplo A herança é um mecanismo pelo qual um objeto filho adquire todas as propriedades da classe pai. ## Abstração em C# O abstração é um processo de apresentação de informações necessárias. O abstração é um processo de mostrar apenas as características essenciais de um objeto para o mundo exterior enquanto as outras informações irrelevantes são ocultadas. ## Polimorfismo em C# O polimorfismo é a presença de múltiplas formas em programação orientada a objetos. O polimorfismo é frequentemente representado como uma interface com várias funções. O polimorfismo pode ser estático ou dinâmico, e a resposta à função é determinada no tempo de compilação para o polimorfismo estático, e no tempo de execução para o polimorfismo dinâmico. ### Exemplos e Exercícios Tente executar os exemplos para a herança única, herança multinível, moultipla herança, e herança hierárquica. Se você tiver problemas ao executar o código, sinta-se à vontade para escrever-nos nas seções de comentários abaixo e a equipe de especialistas nossa estará feliz em ajudá-lo a resolver suas dúvidas, se necessário. Para fins de aprendizagem, também enviaremos o código para todos estes exemplos e exercícios. ## Conclusão Com isso, terminamos a segunda parte da programação orientada a objetos em C#. continuedo com o próximo, o processo de abstração, e depois avançar para o próximo tópico, polimorfismo. # Coleções em C# Explicadas | Coleções em C# para Iniciantes | C# Tutorial | Simplilearn Idioma: pt-PT Olá a todos, sou Bhabha Khandelwal e bem-vindo a você todos ao canal Simplilearn do YouTube. Hoje, vamos abordar coleções em C#, mas primeiro, lembrando-lhe que já temos nossas atualizações diárias em diversas tecnologias. Portanto, se você é um geek tecnológico em busca da última inovação tecnológica, tente assinar o nosso canal do YouTube e não se esqueça de clicar no ícone sino para que você não perca uma atualização sobre Simply Learn. Agora, sem mais ado, vamos começar a agenda para a sessão do dia. Iniciaremos nossa sessão com uma discussão sobre o que são coleções. Depois, teremos uma revisão especializada sobre tipos de coleções. Em seguida, discutiremos coleções genéricas e não genéricas, com um exemplo. Finalmente, termos com algumas dicas sobre coleções. Então, vamos começar a discutir sobre o que são coleções. Primeiro, as classes de coleção são classes especializadas em armazenamento e recuperação de dados. pilhas, filas, listas e tabelas hash são todas apoiadas por elas. Em seguida, as classes de coleção executam várias funções, como alocar memória dinamicamente para os componentes e recuperar uma lista de objetos por índice, entre outras. Finalmente, essas classes construem coleções de objetos, que servem como fundação para todos os tipos de dados em C#. Em seguida, vamos passar pelos tipos de coleção. Eles são principalmente dois tipos de coleção definidos. Primeiro, a coleção genérica, e a não genérica. Vamos discutir detalhadamente. Primeiramente, temos nossas coleções genéricas. Uma coleção genérica é uma classe que fornece segurança de tipo sem Jerarquia da coleção básica e a implementação de membros específicos de tipo. As classes coleção são encontradas no namespace `System. Collections. Generics`. Internamente, Coleção genérica armazena elementos em arrays de seus respectivos tipos, isso significa que se a coleção for do tipo `n`, então ele poderá ter apenas elementos do tipo `n`. Então, temos várias coleções genéricas disponíveis. Primeiro, `List<T>`. Em seguida, `Dictionary<K, V>`. Em seguida, `SortedList<K, V>`. Em seguida, temos `Stack<T>` e por fim `Queue<T>`. Vamos ver o código para cada um dos. Agora, vamos tratar de algumas funções gerais. Primeiro, para declarar uma lista, usamos o síntaxe `List<T>` onde `T` é o tipo de itens que a lista irá armazenar. Em seguida, usamos o identificador `new` para iniciar uma nova lista. Isso é a sintaxe básica para criar uma lista. Para adicionar uma lista, usamos uma função `Add`, então estamos usando `list. Add<T>(item)` para adicionar um item para esta lista. Em seguida, estamos usando um laço `for` para imprimir esta lista. Agora, vamos imprimir. Você pode ver que foi impresso os itens na ordem em que eles foram impressos nesta lista. Vamos fechar isso. Agora, vamos ver o `Dictionary<K, V>`. Aqui, temos este código básico para a dicionário para iniciar a dicionário. Usamos a palavra-chave `Dictionary<K, V>`, então, em parentesis, definimos o tipo de ambas as partes da dicionário, um é `K` (chave), e um é `V` (valor). Em seguida, temos o nome da dicionário, então, novamente usamos o identificador `new` para iniciar realmente esta dicionário. Isso é a sintaxe básica para criar uma dicionário. Então, temos esta função `Add` para adicionar os dados na lista. Note que estamos dando dois valores: um é `key`, que é dado aqui como `k`, e temos uma string `soda`. Agora, usamos uma função `object`, onde estamos perguntando um par chave-valor e o chamamos dessa dicionário, chave-valor significa que basicamente estamos acessando os valores juntos. Poderíamos apenas escrever `k` aqui `chave-valor` na dicionário, e poderíamos obter o mesmo resultado. Então, usamos o comando `WriteLine` na linha direita, basicamente imprimindo a chave e o valor separados por esse espaço. Vamos salvar isso e executar. Aqui, você pode ver que estamos reimprimindo primeiro a chave, depois o valor, cerveja, o mesmo tipo de coisa para hamburguer, franceses e alho fritos. Agora, vamos passar pela `SortedList<K, V>`. Agora, para a lista ordenada, também temos um par chave e valor. Agora, fizemos algo ligeiramente diferente, pois usamos `string` aqui em vez de `K`. Agora, para criar uma lista ordenada, usamos o nome `SortedList<K, V> `, depois definimos um Comparador `<K>` que é dado aqui como `KeyComparer<string>` depois podemos definir dois tipos de valores diferentes. Então, chamamos `sortedList` de `List<V>` como o nome. Em seguida, temos um identificador `new`. Em seguida, basicamente criamos isso. Em seguida, usamos função `Add` para adicionar o valor `key` e `value` para esta lista. Em seguida, usamos um laço `for` para imprimir os valores. Vamos salvar isso. Vamos fechar isso de grifo, para que possamos obter nova informação. Vamos salvar e executar. E aqui, como você pode ver, estamos imprimindo `American Fry`, `Omega Burger`, `French Fries`, `Lime Soda`, `Onion Ring` na mesma ordem em que eles foram adicionados. Agora, vamos passar pela `Stack<T>`. Para uma pilha, usamos `Stack<T>`. Então, estamos apenas dando um valor, pois uma pilha tem apenas um valor no momento. Portanto, estamos dando uma string values a essa pilha, uma vez que eu lhe criei para criar um junho. Em seguida, usamos o identificador `new` e isto é a sintaxe básica para uma pilha. Agora, para a pilha inserir valores na pilha, usamos `Push` comando. Agora, se você lembrar de uma pilha, basicamente empilha um valor em cima de outro. Portanto, se tivermos dado `rear` primeiro, isso se tornará o final, porque primeiro entramos com `rear`, depois a camada média irá passageis acima de "rear", depois a camada média passa a passageir acima da camada média, então "bem-cozido" ficará na parte superior e, em seguida, quando imprimirmos isso, basicamente imprimirá "bem-cozido" primeiro, depois "médio" depois "médio rare" e finalmente "rear". Estamos usando o laço `for` para imprimir isso. Vamos executar. Isso é basicamente "WellDone" na primeira, depois "médio", depois "médio raro", e finalmente "rear". Agora, vamos tentar as filas. Aqui, `q` está usando apenas um tipo de variável, portanto, estamos usando `string` aqui, eu o chamei para fazer um toque de palta. Então, estamos usando o identificador `new` para criar uma nova fila, e isso é a sintaxe básica para criar uma fila. Aqui, para adicionar novos dados em uma fila, usamos `Enqueue` então estamos inserindo "mark", "bill", "xavier", "michael" e também estamos usando um laço `for` para imprimir os valores desta fila. Vamos executar. Aqui, ele está impresso "mark", "BILL", "xavier", "michael" exatamente em ordem como eles foram inseridos. Agora, discutiremos todas estas coleções genéricas. Portanto, agora vamos volta a nossos slides. Escolha a partir de mais de 300 abrangentes habilidades e tenha acesso a mais de 1, 000 horas de conteúdo de vídeo gratuito pela visita livre [Simplilearn por clicando no link na descrição para saber mais](https://www.simplilearn.com/learn-csharp). Agora, vamos discutir coleções não genéricas. As coleções não genéricas são classes especializadas em armazenamento e recuperação de dados que lidam com pilhas, filas, listas e tabelas hash. O namespace `System. Collections` contém as classes não genéricas de coleção. A classes de coleção não genéricas armazenam e objetos internamente, permitindo que possamos ter qualquer tipo de dado. Portanto, a mesma coleção poderá ter diferentes tipos de dados. Agora, temos vários tipos de coleção não genéricas, como `ArrayList`, `HashTable`, então seguimos com `SortedList`, manualmente com `Stack`, finalmente com `Queue`. Agora, vamos passar por alguns códigos para explicar cada uma destas coleções. Aqui, temos uma coleção não genérica. Então, vamos discutir o `ArrayList` primeiro agora. Aqui, para declarar um `ArrayList`, usamos o identificador `ArrayList`, então, se você notar aqui, claramente diferente da lista genérica, não estamos dando nenhum tipo de dados de qualquer tipo, por isso basicamente nos deixa usar diferentes tipos de dados. Em seguida, na linha seguinte, estamos declarando uma string chamada "Compartilhar" e "Inscriga-se", para que você também não esqueça de curtir, compartilhar e inscrever-se neste vídeo. Então usamos a comando `Add` para adicionar todos esses três nesta lista. Então usamos um laço `for` para imprimir a lista serial. Para isso, execute-o agora. Aqui, podemos ver que foi impresso "Compartilhar e inscrever-se", seguido pelo tipo de string, aumentando "Compartilhar e CompareTo Method" em `void`, aumentando `System. Collections` em `Replace`, porque não definimos nenhum replace na sua lista no tempo inteiro. Agora, vamos ver `HashTable`. Em `HashTable` usamos `HashTable` comando, então, dá-lhe um nome, então usamos o identificador `new` para criar uma completa `HashTable`, isso é a sintaxe básica para criar uma `HashTable`. Usamos as funções `Add` para adicionar esses valores. `HashTable` tem dois pares, uma chave e um valor, tal como o dicionário. Agora, usá-lo para comparar a respective função `Dictionary`. se você olhar bem, ele está impresso "quatro", seguido pela "Iringa coxinha", depois de "três", seguido por "Iringa vegetal", depois de "dois", seguido de "burger Iringa", depois de "um", seguido de "Soda Iringa". Isso porque na `HashTable`, a data é Inserida uma em cima da outra, semelhante a uma pilha. Isso é a diferença principal entre um dicionário e uma tabela ordenada. Agora, vamos discutir uma `SortedList`. Em uma `SortedList`, estamos usando `SortedList`. Agora, se você notar algo simples, estamos dando nenhum tipo de ideia sobre o que poderia ser nossa chave e nossa habitacção, tipo de dados desses, então basicamente podemos ter diferentes tipos de dados que também utilizamos o mesmo exemplo que utilizamos anteriormente na classe genérica de Lista ordenada para fazer uma comparação. Se você olhar bem, estamos dizendo, então, usando o mesmo conjunto de dados que estamos utilizando aqui para a Lista não genérica de Lista ordenada para criar uma SortedList, mas agora não estamos definindo nenhum tipo de dado. Agora, vamos tentar exibir. Estamos também usando `foreach` para ter acesso a cada uma destas entradas. Executamos-o e printou "baconburger", seguido pela "batata frita", depois por "cerveja", depois pela "Iringa regina", depois de "frances fritas". Agora, em nossa lista há `Stack`, aqui usamos `Stack`, mas não estamos dando nenhum comparador para saber o que poderia empilhar e o que poderia não empilhar, então basicamente, aceita qualquer tipo de dado. Agora, vamos visualizar isso e printar os valores na ordem em que foram adicionados. E não estamos recebendo erro por nenhum comparador de realização para a nossa `Stack`. Agora, vamos tentar `Queues`, aqui, `q` está usando apenas um tipo de variável, portanto, estamos usando `string` aqui, o nome eu chamei para criar um toque de palta. Em seguida, usamos `new` para criar um novo Conjunto e isso é a sintaxe básica para criar um J défon à associação de %val. Aqui, para adicionar novos dados na J défon à associação, usamos `Enqueue` então estamos inserindo "mark", "bill", "xavier", "michael" e também estamos usando um laço `for` para imprimir os valores para esta J défon à associação. Executamos-o e printou "mark", "BILL", "xavier", "michael" exatamente em ordem como eles foram inseridos. Precisamos de um `IComparer` para associação de que a sorvete caramelo é esmagando todo o valor! Agora, discutiremos as Listas não genéricas. Pro dimensionsum, eliminar, eliminar o valor "sorvete caramelo" da sucursal e escreva a nova lista ordenada no console. ```csharp ArrayList sorbetesDaSorbeteria = new ArrayList { "Strawberry", "Banana", "Mango", "Caramelo" }; int indexCaramelo = sorbetesDaSorbeteria. IndexOf("Caramelo"); sorbetesDaSorbeteria. RemoveAt(indexCaramelo); var novaListaOrdenada = sorbetesDaSorbeteria. OrderBy(s => s); foreach (string s in novaListaOrdenada) { Console. WriteLine(s); } ``` Agora vamos discutir a classe Pro dimensionsum. A classe `Queue` mantém um conjunto de elementos de objetos “FIFO” (primeiro em, primeiro saída). Em `PriorityQueue`, não podemos garantir os elementos serão ordem de prioridade, gerenciando isso via um `IComparer`. ```csharp using System. Collections. Generic; public class PriorityQueue<T> { // Queue implementation private Queue<T> _q = new Queue<T>(); // A method to enqueue an item with a priority value public void Enqueue(T item, int priority) { // Create a new class that wraps the item and the priority var entry = new QueueEntry { Priority = priority, Item = item }; if (_q. Count == 0) _q. Enqueue(entry); IComparerComparer<QueueEntry> comparer = Comparer<QueueEntry>. Create((a, b) => a. Priority. CompareTo(b. Priority)); // Add item to the front of the queue if the priority is higher, // or at the end if the priority is lower. _q. OrderBy(a => a, comparer). Aggregate(entry, (prev, next) => { if (next. Priority >= prev. Priority) _q. Enqueue(next); return prev; }); } // Your code implementation of a Queue<T>. Dequeue()method // can be called here to get the first item in order of priority // Make sure the order in Queue is maintained } internal class QueueEntry { public int Priority { get; set; } public T Item { get; set; } } using System; class Program { static void Main(string[] args) { var pq = new PriorityQueue<string>(); // Enqueue some items pq. Enqueue("Soda", 1); pq. Enqueue("Onion Rings", 3); pq. Enqueue("French Fries", 2); pq. Enqueue("Burger", 4); // Get items from the queue // in order of priority, and print them while (pq. Count > 0) Console. WriteLine(pq. Dequeue()); } } ``` He usamos a fila de prioridade para desenha-lo, ela mantém, uma sequência de itens em objetos FIFO. Em `PriorityQueue`, podemos garantirItems estarão na ordem de prioridade, gerenciando isso com um `IComparer`. Além das Listas genéricas que discutimos anteriormente, este exemplo também mostra como poderemos criar uma fila de prioridade personalizada para manter a fila de prioridade com itens em objetos FIFO, mas aplicando uma prioridade a cada iten que é utilizado quando chamamos a função `Enqueue`. Quando a regra de fila FIFO não é necessária, mas prioriza-se a ordem do elemento, isso é um álbum de prioridade útil. Seja bem-vindo(a)! Se gostou deste vídeo, inscreva-se no [canal YouTube da Simplilearn](https://www.youtube.com/watch?v=IqQ7QpmiBJ0) e clique [aqui](https://www.youtube.com/watch?v=IqQ7QpmiBJ0) para assistir a vídeos semelhantes. Ajuste o volume e certifique-se! Clique [aqui](#). --- **Ideia: ** Explicação sobre árvores e grafos em C#, sua importância e aplicação prática. **Pré-requisitos: ** Familiarridade com C# e estruturas de dados básicas. **Agenda: ** 1. Importância das estruturas de dados árvore e grafo em C# 2. Árvore de dados - Fundamentos - Tipos de árvores - Operações básicas e termos relacionados - Traversana da árvore - Aplicações da estrutura de dados árvore 3. Grafo de dados - Introdução - Tipos de grafos - Operações básicas - Terminologia do grafo - Traversana do grafo - Representação da estrutura de dados do grafo - Exemplos em mundo real **Importância: ** As estruturas de dados árvore e grafo em C# são essenciais para o programação moderna. Cada uma dessas estruturas é utilizada para construir uma modelagem dos problemas do mundo real, que são então resolvidos de forma eficiente utilizando esta modelagem. **Árvore de dados: ** - Definição: Uma árvore é um formato de representação hierárquica dos dados. Cada nó em uma árvore possui dois componentes: dados e referências. - Hierarquia: O nó superior da árvore é conhecido como o nó raiz. As duas ramificações informes são conhecidas como a subárvore esquerda e subárvore direita ou filhos. - Exemplo: Uma estrutura organizacional pode funcionar como uma hierarquia. **Tipos de árvores: ** 1. Árvore geral: Nenhuma restrição é imposta na hierarquia da árvore. Cada nó pode ter um número ilimitado de filhos. 2. Árvore binária: Uma árvore binária é uma árvore onde cada nó pai pode ter no máximo dois filhos. Os filhos são referenciados como o filho esquerdo ou direito. 3. Árvore de pesquisa binária: Uma árvore de pesquisa binária é uma extensão da árvore binária com algumas restrições adicionais. Os valores dos dados de um nó filho à esquerda de sua árvore não podem ser maiores ou iguais aos valores de seu nó-pai, enquanto os valores dos dados de um nó filho à direita sobrelhe seus valores pais. 4. Árvore AVL: A árvore AVL é uma árvore de pesquisa binária autobalanceada que se autoequil ibalancea para manter a altura da árvore. 5. árvore Vermelha-Negra: Outro tipo de árvore autobalanceada é a árvore Vermelha-Negra. **Operações básicas: ** 1. Inserção 2. Exclusão 3. Busca **Termos relacionados: ** 1. Nó Raiz 2. Rama 3. Nó Pai 4. Nó Filho 5. Nó Descendente 6. Nó Irmão 7. Grau 8. Nível 9. Traversana **Traversana da árvore: ** 1. Busca em Largura (BFS) 2. Busca em Profundidade (DFS) - Percurso pré-ordem - Percurso em ordem - Percurso pós-ordem **Demonstração de código para a Traversana da árvore com pré-ordem, em ordem e pós-ordem: ** [Aqui](#) **Grafo de dados: ** - Introdução - Tipos de grafos - Operações básicas - Terminologia do grafo - Traversana do grafo - Representação da estrutura de dados do grafo - Exemplos em mundo real --- **Slides: ** - Importância das estruturas de dados do grafo - árvore de dados: Introdução - Árvore geral - Árvore binária - Árvore de pesquisa binária - Árvore AVL - Árvore Vermelha-Negra - Operações básicas - Operação de busca - Terminologia relacionada - Busca em Largura - Busca em Profundidade - Percurso pré-ordem - Percurso em ordem - Percurso pós-ordem - Demonstração de código para a traversana da árvore - Descrição do grafo de dados - Tipos de grafos - Operações básicas - Terminologia relacionada - Traversana do grafo - Representação da estrutura de dados do grafo - Exemplos em mundo real ``` # Estruturas de Dados de árvores e de Grafo em C# Explorando os fundamentos e aplicativos com exemplos ## Tabela de Conteúdos 1. [Estruturas de árvores em C#](#1-estruturas-de-árvores-em-c-sharp) - [1. 1 Usando árvores em C#](#11-usando-árvores-em-c-sharp) - [1. 2 Tipos de Traversal](#12-tipos-de-traversal) 1. [1. 2. 1 Busca de Largura Primeiro em Fundo (BLP)](#121-busca-de-largura-primeiro-em-fundo-blp) 2. [1. 2. 2 Busca em Profundidade Primeiro (BDF)](#122-busca-em-profundidade-primeiro-bdf) - [1. 3 Aplicações de árvores](#13-aplicações-de-árvores) 1. [1. 3. 1 Parsers de XML](#131-parsers-de-xml) 2. [1. 3. 2 Algoritmos Decisão em Aprendizagem de Máquina](#132-algoritmos-de-decisão-em-aprendizagem-de-máquina) 3. [1. 3. 3 Servidores de Nome Domain (DNS)](#133-servidores-de-nome-domain-dns) 4. [1. 3. 4 Explorador de Fichas](#134-explorador-de-fichas) 5. [1. 3. 5 Computação Gráfica](#135-computação-gráfica) - [1. 4 Estruturas de Grafo em C#](#14-estruturas-de-grafo-em-c-sharp) 1. [1. 4. 1 Operações Básicas de Grafo](#141-operações-básicas-de-grafo) 1. [1. 4. 2 Terminologia de Grafo](#142-terminologia-de-grafo) - [1. 5 Exemplos Reais de Grafo](#15-exemplos-reais-de-grafo) 1. [1. 5. 1 Redes Sociais](#151-redes-sociais) 2. [1. 5. 2 Algoritmos de Otimização de Caminho](#152-algoritmos-de-otimização-de-caminho) 3. [1. 5. 3 Google Maps](#153-google-maps) 4. [1. 5. 4 Redes Aéreas](#154-redes-aéreas) 2. [Dicionário, Tabelas Hash e Conjuntos em C#](#2-dicionário-tabelas-hash-e-conjuntos-em-c-sharp) - [2. 1 Entendendo a Classe Dictionary](#21-entendendo-a-classe-dictionary) - [2. 2 Tabelas Hash e Pares Chave-Valor](#22-tabelas-hash-e-pares-chave-valor) - [2. 3 Ajustando Tabelas Hash](#23-ajustando-tabelas-hash) - [2. 4 Tabelas Hash – Desempenho](#24-tabelas-hash-desempenho) - [2. 5 SortedDictionary](#25-sorteddictionary) - [2. 6 Conjuntos](#26-conjuntos) --- ## 1. Estruturas de árvores em C# ### 1. 1 Usando árvores em C# PMáximo começar com a comprensão de como as árvores podem ser implementadas em C#. Navegando pelas árvores, o objetivo é percorrer todos os nós seguindo regras específicas. - Usando recursão ou iteração para visitar cada nó da árvore. - Utilizando um Stack (BFS) ou Queue (DFS) para o percorrimento. ### 1. 2 Tipos de Traversal **1. 2. 1 BFS (Busca de Largura Primeiro em Fundo - BLP)** BLP é um método de exploração de gráficos que calcula o caminho mais curto entre um nó de início para qualquer outro nó em um grafo conexo. Este algoritmo generalmente explora todos os nós numa patroawo lével a lével a partir do nó fontal. **1. 2. 2 DFS (Busca em Profundidade Primeiro - BDF)** A BDF explora o maior possível nas profundidades de manipulação de uma ramificação antes de retroceder para outras ramificações. Em outras palavras, explora seja endiçado a sequência recusrionais do grafo. Esta técnica pode ser utilizada para encontrar caminhos entre nós em grafos, ciclos em que esses existem, e solução dos problemas Hamiltoniano e do vendedor de cavalarias. ### 1. 3 Aplicações de árvores **1. 3. 1 Parsers de XML** Os parers XML usam as estruturas de árvore para interpretar documentos com uma estrutura de etiquetas aninhadas. **1. 3. 2 Algoritmos Decisão em Aprendizagem de Máquina** Os Árvores Decisão são uma técnica de aprendizagem de máquinas comummente usada para ambos regressão e classificação. Eles funcionam por dividindo a dada em conjuntos baseados em crítrias de decisão e podem ser representados como uma estrutura de árvore onde cada nó mapeado representa uma decisão, raízes representando transições e folhas indicam uma decisão ou deliberação. **1. 3. 3 Servidores de Nomes Domáine (DNS)** O DNS usa as estruturas de árvore semelhantes aos nome dos domínios, chamadas árvores de nome doménio. Esta estrutura hierárquica licitamente organiza nomes de domínios em uma estructura de árvore. **1. 3. 4 Explorador de Fichas** O sistema de ficheiras em sistemas de operação de computador, geralmente organiza-se em estrutura de árvore. Cada pasta pode conter fichas ou outras pastas, ao novo criando uma hierarquia que facilita a navegacião e a busca para ficheiros. **1. 3. 5 Computação Gráfica** Na computação gráfica, Arvores Binárias (BT) são использованы comumente em sorting and comparing algorithms relacionados ao rendering de cenas e objetos. Para melhor performance gráfica, alguns display lists implemente eorganiza e otimizan as operações de desenho, baseado em uma árvore binaria. # Dicionários, Tabelas Hash e Conjuntos em C# (Português de Portugal) Um dicionário em C# representa uma coleção genérica de pares chave-valor. É uma classe definida no namespace `System. Collections`, que pode incluir qualquer tipo de dados nas formas de chaves e valores. Cada chave em uma coleção deve ser única. Aqui está a sintaxe para declarar um dicionário: ```csharp Dictionary<string, int> dicionario = new Dictionary<string, int>(); ``` ## Métodos no Dicionário Existem quatro métodos principais que podem ser aplicados em um dicionário: 1. `Add`: Para adicionar um par chave-valor. 2. `Remove`: Para remover um par chave-valor. 3. `Find`: Para localizar um par chave-valor ou substituí-lo. ## Exemplo ```csharp using System; using System. Collections. Generic; namespace DicionarioExample { class Program { static void Main(string[] args) { // Criar um dicionário com uma chave string e um valor int. Dictionary<string, int> dicionario = new Dictionary<string, int>(); // Adicionar pares chave-valor dicionario. Add("carro", 32); dicionario. Add("fala", 25); dicionario["3"] = 29; dicionario["linha"] = 21; dicionario["permisão"] = 34; // Contar palavras no dicionário Console. WriteLine($"Contagem: {dicionario. Count}"); // Substituir o valor de um par chave. if (dicionario. ContainsKey("árvore")) { dicionario["árvore"] = 9; } else { dicionario["cachorro"] = 20; } // Localizar um par chave usando o valor Console. WriteLine("Par chave encontrado: árvore"); // Ler todos os pares chave-valor foreach (KeyValuePair<string, int> entry in dicionario) { Console. WriteLine($"Chave: {entry. Key}, Valor: {entry. Value}"); } // Remover um par chave dicionario. Remove("assunto"); // Remover todos os pares chave-valor dicionario. Clear(); } } } ``` --- ## Tabelas Hash em C# Uma tabela hash em C# armazena pares chave-valor onde as chaves podem ser encontradas por sua posição pois é imutável. Uma tabela hash não pode ter entradas duplicadas. As `DictionaryEntry` objetos têm duas propriedades: uma chave e um valor. Os valores de uma tabela hash podem ser acessados apenas definindo um objeto de chave. Aqui está a sintaxe para definir uma tabela hash: ```csharp Hashtable tabelaHash = new Hashtable(); ``` ## Propriedades da Tabela Hash 1. `Comparador`: Retorna ou define o `IComparer` a ser usado. 2. `Count`: Retorna o número de pares chave-valor na tabela hash (leitura somente). 3. `Item`: Retorna ou define o valor associado a uma chave. 4. `Chaves`: Retorna um `ICollection` que contém as chaves da tabela. 5. `Valores`: Retorna um `ICollection` que contém os valores na tabela. --- ## Conjuntos em C# As conjuntos em C# são referenciados como conjuntos de hash. Conjuntos de hash garantem que não haja strings ou elementos duplicados em um array. Aqui está a sintaxe para declarar conjuntos: ```csharp HashSet<string> conjunto = new HashSet<string>(); ``` ## Exemplo ```csharp using System; using System. Collections. Generic; namespace ConjuntoExample { class Program { static void Main(string[] args) { // Declarar um array de strings string[] arr1 = { "papel", "lápis", "borracha", "canetas", "papel" }; // Converter o array em um conjunto usando o método toArray() HashSet<string> conjunto1 = new HashSet<string>(arr1. ToArray()); // Imprimir o conjunto Console. WriteLine(string. Join(", ", conjunto1)); } } } ``` Neste código, o elemento duplicado `"papel"` é removido do array ao convertê-lo em um conjunto. --- ## Async Await em C# O Programação Assíncrona permite que uma aplicação funcione em outras tarefas enquanto aguarda a conclusão da tarefa. As palavras-chave `async` e `await` são usadas para alcançar isso em C#. ### Exemplo ```csharp using System; using System. Threading. Tasks; namespace AsyncAwaitExample { class Program { static async Task Main(string[] args) { // Método longo de exemplo await LongRunningMethod(); Console. WriteLine("Concluído! "); } private static async Task LongRunningMethod() { Console. WriteLine("Iniciando o método longo. . . "); await Task. Delay(3000); Console. WriteLine("Método longo concluído! "); } } } ``` Neste código, o `LongRunningMethod` executa assincronicamente, e a programação continua a executar enquanto o método é executado. Quando o método estiver concluído, a mensagem "Concluído! " é impressa. Título principal: C# Wait Explicado | Exemplo e Tutorial do C# Wait Task | Tutorial de C# para Iniciantes | Simplilearn ============================================================================ Seção introdução: --------------- Bem-vindo ao canal do Simplilearn! Hoje você aprenderá um assunto interessante, o C# Wait. Antes de começarmos, garantimos que sejam atualizados diariamente sobre várias tecnologias. Se você é um tecnólogo curioso em busca de tendências tecnológicas novas, considere se inscrever no nosso canal do YouTube e não esqueça de clicar no ícone de "penelope" para não perder nenhuma atualização do Simplilearn. Agora, sem mais adinímos, vamos começar com a agenda para esta sessão. Iniciaremos os seguintes tópicos: - Definindo o que é C# Wait e que códigos e arquivos são usados para essa definição. - Explicando sobre alguns sobrecarregamentos do C# Wait. Seção C# Wait definido e utilizado: ---------------------------------- O C# Wait é um método sincrônico que faz com que o thread principal (thread atual) espere até que o thread tasksployer executado termine. Existem diversos métodos para isso, dentre eles a classe `Task` e a interface `IAsyncResult`. Exemplo: ```csharp using System; using System. Threading. Tasks; class MainClass { public static async Task Main(string[] args) { Task<int> task = new Task<int>(() => { /* Aqui você deve executar os processamentos que precisa */ return 10; }); task. Start(); int result = await task; Console. WriteLine("Task result: {0}", result); } } ``` Neste exemplo, aprofundaremos sobre como trabalhar com diversos métodos e sobrecargas para o C# Wait, com exemplos completos e de código. Seção C# Wait sobrecarregamento: ------------------------------- Existem várias sobrecargas do método Wait, cada uma delas com uma finalidade diferente. Essas sobrecargas existem para tornar a interação com o uso do C# Wait flexível, prático, permitindo aos programadores escolher sob consentimento a melhor suíte de sobrecargas para suas necessidades. As sobrecargas do C# Wait incluem: - Wait(TimeSpan): Espera por um período de tempo determinado (em segundos) passado pelo argumento TimeSpan, até que o thread task termine sua execução. - WaitOne(TimeSpan): Espera por um ou mais threads, passados pelo array do tipo Task, até que elas terminem sua execução. - WaitAll(Task[] tasks): Espera até que todos os threads passados pelo array do tipo Task termine sua execução. - WaitAny(Task[] tasks): Espera como WaitAll, porém retorna o thread que terminar primeiro da lista de threads passadas. Conclusão: ---------- Esperamos que esta apresentação tenha sido útil e informativa! Acima, apresentamos alguns métodos fundamentais e sobrecargas do C# Wait, providos com exemplos de código e detalhes precisos sobre sua utilização. Caso você tenha alguma pergunta gostaria de nos mandar, por favor deixe nosso comentário abaixo. Se você gostou desta sessão, por favor deixe-nos um Like e subscreva nosso canal, para não faltar nenhum conteúdo por nosso canal. Obrigado! Nesta tradução, mantive a formatação Markdown original e utilizaram sinal de gramatical para as palavras em inglês não traduzidas. As traduções foram feitas utilizando o português europeu. ```markdown # Tutorial de C# MVC CRUD: Operações CRUD em Asp. Net MVC usando Entity Framework | Simplilearn Idioma: en ## Visão Geral O design pattern Model-View-Controller (MVC) tem sido extenso utilizado durante várias décadas em várias tecnologias. Este padrão de projeto é usado desde pequenas aplicações até a C++, Java e C#. NET applications web beneficiam-se desta maneira potente e direta de desacoplar problemas dentro da aplicação. Olá, todos! Sou Pepper Khandelwal e bem-vindos ao canal YouTube Simplilearn. Hoje, vamos implementar operações CRUD em Asp. Net MVC. Mas primeiro, permita que me lembre de você que temos atualizações diárias de várias tecnologias, então se você é um entusiasmado da tecnologia a procura de inovações tecnológicas, tente inscrever-se no nosso canalYoutube e não esqueça de ativar o ícone de sino para você jamais perca uma atualização sobre o Simplilearn. ### Agenda para a Sessão de Hoje - Discussão sobre o que é Asp. Net MVC - Breve discussão sobre a necessidade de Asp. Net MVC - Implementação de operações CRUD em Asp. Net MVC - Conclusão da sessão com uma ou duas lembranças Agora, vamos começar a discussão sobre o que é Asp. Net MVC. ## O que é Asp. Net MVC? O Asp. Net MVC da Microsoft é essencialmente um framework web de design, e o MVC do Asp. Net integra elementos de projeto MVC com princípios e práticas de desenvolvimento ágil atuais e componentes do maior Asp. Net da plataforma existente. Pois é construído sobre o topo do Asp. Net, os desenvolvedores podem utilizar praticamente todas as capacidades do Asp. Net ao desenvolver a aplicação MVC. O Asp. Net MVC não é algo criado de raiz; ele é uma substituição completa para a ASP. NET Web Forms regulares. ### A necessidade de Asp. Net MVC 1. Quando se desenvolve uma aplicação da web usando o Asp. Net MVC, não haverá ilusiones de estado, nenhuma reload de página, e nenhuma ciclo de vida da página. 2. Outro objetivo do Asp. Net MVC foi ser extensível ao longo de toda a infraestrutura, portanto, quando discutimos as vistas, elas devem ser exibidas pelo tipo de motor de exibição específico. 3. O ponto de utilizar o padrão Model-View-Controller é para separar as coisas. Um componente MVC instancia controllers. Se você não gostar como o MVC instancia o seu controller, você pode fazer isso por conta própria. ## Implementação de Operações CRUD em Asp. Net MVC ### Definindo o Projeto Vamos começar criando o projeto. No Visual Studio, fazemos uma aplicação web Asp. Net com o . NET Framework. Vamos criar um novo projeto: 1. Clique em Novo projeto. 2. Selecione Web > ASP. NET Web Application (. NET Framework). 3. Nomeie o projeto (por exemplo, MVCApp) e se="<? php echo date('Y-m-d')? >-time-"? seletione que o . NET Framework 4. 7. 2 esteja selecionado. 4. Clique em Próximo e escolha o modelo do MVC. 5. Clique em Criar. ### Conexão com Banco de Dados Vamos nos conectar com o banco de dados. Para este exemplo, vamos utilizar o LocalDB MSSQL LocalDb Server, mas você pode optar por qualquer SQL server que desejar: 1. Vá ao painel explorador à esquerda e clique em Databases. 2. Clique com o botão direito do rato e selecione Adicionar SQL Server Database, insira o nome do Servidor, selecione o método de Autenticação, insira o nome do Banco de Dados (por exemplo, MvcApp), e clique em OK. ### Definição do Model Agora precisamos criar o model: 1. Vá para a pasta Models e crie uma nova classe chamada Student: ```csharp using System. ComponentModel. DataAnnotations; using Microsoft. EntityFrameworkCore; namespace MVCApp. Models { public class Student { [Key] [DatabaseGenerated(DatabaseGeneratedOption. Identity)] public int StudentId { get; set; } public string StudentName { get; set; } public decimal StudentFee { get; set; } public string StudentCity { get; set; } } } ``` 2. Abra o "appStart" pasta e o arquivo web. config para habilitar Entity Framework: ```xml <connectionStrings> <add name="MVCAppContext" . . . . . . ``` ``` ``` ``` ``` # Tutorial de API REST em C# | API REST em C# | Tutorial de API REST para iniciantes | C# Tutorial | Simplilearn A ideia: o desenvolvimento está continuamente evoluindo e melhores soluções de software estão sendo implementadas todos os dias com a ajuda de tecnologias emergentes. As APIs (Application Programming Interface) são essenciais se você quiser construir um sistema com múltiplas funções e documentada. Nesteinburgh, vou abordar a API REST em C#. --- Idioma: en - A ideia de desenvolvimento é sempre dinâmica - Soluções de software estão sendo implementadas todos os dias com a ajuda de técnicas emergentes - As APIs são essenciais se você quiser construir um sistema com múltiplas funções e documentada - Em resumo. . . Olá, eu sou Vavo Khandelwal, e bem-vindos(as) ao nosso canal YouTube Simply Learn - Vamos falar sobre API REST em C# - Mas primeiro, permita-me lembrar sobre nossas atualizações diárias em várias tecnologias - Então se você é um entusiasta de TI procurando as últimas avançadas tecnológicas, temos um vivo incentivo para começar seu assinante em nosso canal do YouTube e não esqueça de clicar no ícone Grito após o dispositivo para nunca faltar uma atualização no canal Simply Learn YouTube - Agora, sem mais ado, vamos iniciar a agenda para a sessão deste dia - Começaremos esta sessão com a discussão sobre o que é API REST - Em seguida, teremos uma discussão curta sobre os verbos HTTP - Depois disso, vamos ter uma olha em alguns códigos de status HTTP - Vamos ter uma discussão mais detalhada sobre as restrições da API REST - Depois disso, vamos criar nosso próprio projeto da API REST - Finalmente, vamos finalizar esta sessão com alguns resumos - Agora, vamos começar com o que é API REST em C# * API REST é um acrônimo que significa Transferência de Estado Representacional (REST) * A API REST é arquiteturalmente estilizado para sistemas distribuídos baseado em ideias refinadas e endereçando recursos de rede * HTTP é utilizado para comunicar entre serviços RESTful, onde HTTP se refere ao Protocolo de Transferência de Hipertexto (HTTP) * As sistemas REST comunica com sistemas externos usando identificadores de recursos URI, onde URI se refere a Identificadores de Recursos Uniformes --- ## Verbos HTTP A interface da API REST se baseia muito nos verbos HTTP - Post, GET, PUT e DELETE são os verbos HTTP mais typicals utilizados para atividades CRUD (criar, ler, atualizar, excluir) --- ### POST - Para inserir dados em banco de dados, devemos definir o método como POST - Decoramos esse método com [HttpPost] atributo para definir um método POST --- ### GET - A recuperação de dados ou informação é possível por means de GET - Decoramos o método com [HttpGet] atributo para definir um método GET --- ### PUT - Para atualizar ou modificar dados no banco de dados, devemos definir o método como PUT - Decoramos o método com [HttpPut] atributo para definir um método PUT --- ### DELETE - Para excluir os dados do banco de dados, devemos definir o método como DELETE - Decoramos o método com [HttpDelete] atributo para definir como o método DELETE --- ## Códigos de status HTTP Há cinco séries de códigos de status - A série 100 representa status de informação - A série 200 representa status de sucesso - A série 300 representa status de redirecionamento - A série 400 representa status de erro de cliente - A série 500 representa status de erro do servidor - Nossa ênfase será nos status de sucesso do cliente e do servidor somente - Vamos ter uma olha em três deles + 200 série - 200 OK - 201 Created - 202 Accepted - 204 Nenhum Contido --- ### Série 400 (de erro do cliente) - 400 Solicitação Inválida - 401 Sem Autorização - 403 Proibido - 404 Não Encontrado --- ### Série 500 (de erro do servidor) - 500 Erro Interno do Servidor - 501 Não Implementado - 503 Serviço Indisponível - 504 Timeout da Gateway --- ## Restrições da API REST em C# Há cinco restrições para a interface uniforme: - Estado - Cliente-servidor - Cachável - Sistema em camadas - Código sob demanda (opcional) - Vamos discutir cada uma delas em detalhes --- ### Estado - Um único cliente pode enviar muitas solicitações para o servidor, mas cada solicitação deve ser independente - Cada solicitação deve conter toda a informação necessária para que o servidor interprete e processe as informações - Nesse caso, o servidor não deve salvar algum estado do cliente, com o que somente informações dessa deverão manter apenas no cliente --- ### Cliente-servidor - A interface uniforme separa clientes e servidor por causa da separação de responsabilidade - Clientes, por exemplo, não estão preocupados com armazenamento de dados, que permanecem internos para cada servidor + Melhorando a mobilidade de programas de cliente - Servidores não estão preocupados com interface do usuário ou estatus do usuário + Permitindo que eles sejam mais simples e mais escaláveis --- ### Cachével - Múltiplos clientes visitam o mesmo servidor e frequentemente requisitam o mesmo recursos - As respostas devem ser armazenadas para evitar tratamento desnecessário e velocizar significativamente --- ### Sistema em camadas - Normalmente, um cliente não conhece se ele está conectado diretamente ao servidor ou por um intermediário - De ponto de vista de intermediário servidor, isso melhora a escalabilidade do sistema facilitando balanceamento de carga e fornecendo caches compartilhados - Camadas podem também cobrir políticas de segurança --- Agora, vamos criar nossa própria API REST - Vamos utilizar ASP. NET Core Web API, então vamos chamar o projeto de **StudentRestAPI** + Clique em **Avançar** + Lembrar-se de lembrar qual versão do . NET Framework você está usando, pois algumas das bibliotecas que usaremos só estarão disponíveis para determinadas versões (…) --- ## O que é Web API em C# REST O Web API em C# é um padrão de desenvolvimento que utiliza um conjunto de interfaces baseadas na web para criar serviços REST full. Ele é usado para fornecer funcionalidades de comunicação de sinalização mistas e negociar recursos na web e é usado para criar APIs REST que podem ser expostas e consumidas por meio de HTTP. Os recursos Web API são compatible com vários navegadores, motores de código para web explicitamente. A experiência do usuário é mais semelhante a uma API, com formulários para recuperação, publicação e manipulação de recursos, além de oferecer funcionalidades sem captura e resposta de sinais. Para criar um novo projeto de Web API, abra Visual Studio e escolha o modelo de projeto **Web API** na seção de projeto do Visual Studio. ``` Tim guns # Tutorial de Serviços Web em C# Este tutorial fornece uma explicação de serviços web em C# para iniciantes. Siga junto enquanto discutimos o que são serviços web em C#, sua implementação e seus vantages e desvantages. ## Agenda 1. Introdução aos serviços web em C# 2. Tecnologias que suportam serviços web em C# 3. Implementando serviços web em C# no Visual Studio 4. Vantages e Desvantages de Serviços Web 5. Sintetização de Serviços Web em C# ## O Que São Serviços Web em C#? Os serviços web são recursos web baseados que são acessados por meio de protocolos web e utilizados por aplicações online. Embora tenham sido criados antes do lançamento da framework . NET, são apoiados por várias plataformas além da Microsoft. ## Tecnologias que Suportam Serviços Web em C# ### API REST API REST (Representational State Transfer) é uma arquitetura popular para a construção de serviços web. Ele permite a comunicação entre clientes e servidores através de solicitações HTTP e respostas, servindo como um meio de acesso único ao sistema. ## Implementando Serviços Web em C# no Visual Studio 1. Criar um novo projeto no Visual Studio, selecionando o modelo de "API Web ASP. NET Core". 2. Defina seus pontos finais, modelos e controladores de acordo com a funcionalidade desejada. 3. Utilize métodos HTTP como GET, POST, PUT e DELETE para manipular dados e interactuar com o banco de dados. 4. Utilize bibliotecas como `System. Web. Http` ou `Microsoft. AspNetCore. Mvc` para simplificar o processo de desenvolvimento. ## Vantages e Desvantages de Serviços Web ### Vantages 1. **Independência da Plataforma**: Os serviços web sãoindependentes da plataforma, tornando-os acessíveis a várias linguagens de programação e sistemas operacionais. 2. **Simplicidade**: As APIs REST oferecem uma abordagem simples para o desenvolvimento e consumo de serviços web, utilizando HTTP como camada de transporte e JSON ou XML como formatos de dados. 3. **Escalabilidade**: Os serviços web podem lidar com uma grande quantidade de solicitações concorrentes simultaneamente e escalarem easilmente conforme a base de utilizadores se expandir. ### Desvantages 1. **Preocupações de Segurança**: Como os serviços web são baseados no protocolo HTTP, poderão ser vulneráveis a diversos tipos de ataques como injetção, modificação e escutando. 2. ** falta de padronização**: Enquanto APIs REST seguem um padrão comum, não há especificação formal para como elas devem ser projetadas e implementadas, resultando em incongruências entre as APIs diferentes. 3. **Problemas de performance**: As APIs REST podem experimentar uma degradação de desempenho ao lidar com modelos de dados complexos e grandes conjuntos de dados, pois cada solicitação requer a comunicação de ida e volta entre o cliente e o servidor. ## Sintetização de Serviços Web em C# 1. Os serviços web são recursos web baseados acessados por meio de protocolos web e utilizados por aplicações online. 2. As APIs REST são uma escolha popular para a construção de serviços web, oferecendo a comunicação entre clientes e servidores através de solicitações HTTP e respostas. 3. Os serviços web em C# podem ser facilmente implementados no Visual Studio ao definir pontos finais, modelos e controladores eutilizando bibliotecas como `System. Web. Http` ou `Microsoft. AspNetCore. Mvc`. 4. Os serviços web oferecem vantages tais como independência da plataforma, simplicidade e escalabilidade, mas podem enfrentar preocupações de segurança, falta de padronização e problemas de desempenho. # Tutorial de Web Services em C# ## Resumo Este tutorial discutirá Web Services em C#, enfocando as tecnologias que suportam e sua implementação no Visual Studio. ### Web Services XML - O XML especifica os dados como o resultado, permitindo que aplicações que entendem XML os formatem de acordo com o idioma ou plataforma de programação respectiva. - SOAP estabelece a comunicação entre serviços e aplicações. - WSDL fornece uma tecnologia consistente para especificar web services para outras aplicações. - UDDi permite a registro e busca de web services usando UDDi. ### Web Services XML Detalhadas 1. Web Services XML - Especifica os dados como o resultado, permitindo que aplicações que entendem XML os formatem de várias maneiras. 2. SOAP - Estabelece a comunicação entre serviços e aplicações. 3. WSDL - Fornece uma tecnologia consistente para especificar web services para outras aplicações. 4. UDDi - Permite registro e busca de web services usando UDDi. ### Implementação em Visual Studio 1. Criar um novo projeto: - Utilize Aplicação Web ASP. NET com a . NET Framework 4. 7. 2. - Nomeie o projeto "Aprendendo Web Services". 2. Criar um serviço web: - Clique com o botão direito no nome do projeto. - Adicionar > Novo Item > Serviço Web (ASMX). - Nomeie o serviço "Aprendendo Serviço". 3. Implementar o serviço web: - Permitir que o serviço web seja chamado por um script usando ASP. NET ASMX. - Descomente a seguinte linha: ``` <System. Web. Services. WebService(Namespace : = "http://tempuri.org/")> ``` - Crie uma `Soma` método público com parâmetros `x` e `y` e retorne `x + y`. - Para reutilizar variáveis ou métodos, adicione nomes de mensagens como: ``` <WebMethod(MessageName : = "SomaValores")> Public Function Soma(ByVal x As Int, ByVal y As Int) As Int End Function ``` - Repita o processo para funções adicionais, como `Diferença`, `Produto`, e `Divisão`. 4. Exibir a descrição do serviço: - É uma descrição formal que contém uma descrição completa de dados web. ### Vantagens e Desvantagens dos Web Services em C# #### Vantagens - Padrão de texto aberto usado por web services. - Componentes são utilizados por web services, mesmo que sejam construídos em diferentes idiomas para diferentes plataformas. - Simples de desenvolver, pois dependem de infraestruturas existentes. - Permitir que a maioria das aplicações sejam repackage como web services. - Interoperabilidade com centenas de fornecedores. - Encourage o desenho modular de desenvolvimento. - Reduzir o custo de integração de aplicativos enterprise e interação commercial entre empresas. #### Desvantagens - Pode se tornar lento em situações de alta performance. - A qualidade de determinados serviços online pode ser descrita de forma inconsistente. - A habilidade do fornecedor de manter a propriedade intelectual de determinada norma é uma restrição. ### Conclusão Os web services são uma parte essencial do desenvolvimento de aplicações modernas, e o C# oferece ferramentas potentes para criar e utilizar deles. Com sua suporte para XML, SOAP, WSDL e UDDi, o C# permite que os desenvolvedores criem web services que possam se comunicar com uma variedade de plataformas e idiomas de programação. # Tutorial de Web API em C# Neste tutorial, vamos aprender sobre Web API em C#, discutir seus recursos e criar um projeto web API simples. ### O que é Web API em C#? API stands for Application Programming Interface, um conjunto de rotinas, protocolos e ferramentas para desenvolver software e aplicações em programação de computador. Web API é uma API web que pode ser acessada pelo protocolo HTTP. Ele é uma ideia em vez de uma tecnologia, permitindo-nos criar APIs web usando várias tecnologias como Java, . NET, e outras. ### Web API ASP. NET ASP. NET Web API é um quadro extensível para criar serviços HTTP-based que podem ser acessados em várias aplicações em várias plataformas. ### Recursos de Web API em C# - Suitable for developing RESTful services. - Based on ASP. NET and supports the ASP. NET request-response pipeline. - Supports multiple response data formats like JSON, XML, and BSON. - IIS self-hosted or any other web server that supports . NET 4. 0 or higher can host ASP. NET Web API. - Includes a new HTTP client for communicating with the web API server, which can be used on various platforms. ### Versões de Web API em C# 1. Web API 1. 0: Supports . NET Framework 4. 0, coincides with ASP. NET MVC4, and supports the Visual Studio 2010 version. 2. Web API 2. 0: Supports . NET Framework 4. 5, is compatible with ASP. NET MVC5, and Visual Studio 2012 and 2013. ### Diferenças entre Web API em C# e WCF - Web API é open-source e inclui a . NET Framework, enquanto WCF não. - Web API suporta o protocolo HTTP, enquanto WCF suporta HTTP, TCP, UDP, e protocolos de transporte personalizados. - Web API suporta o mapeamento de HTTP verbs para métodos, enquanto WCF não. - WCF utiliza um modelo de programação baseado em atributos, enquanto Web API utiliza uma abordagem de roteamento e controlador semelhante a ASP. NET MVC. - Web API não suporta mensagens fiáveis ou transações, enquanto WCF sim. - Web API é configurado usando uma classe de configuração HTTP, enquanto WCF usa um arquivo web. config. - Web API é ideal para criar serviços RESTful, enquanto WCF pode criar serviços RESTful mas com limitações. ### Quando Utilizar WCF - Se você estiver utilizando o . NET Framework 3. 5, utilize WCF. - Se sua service necessitar de suporte a vários protocolos como HTTP, TCP e canais nomeados. - Se você desejar construir serviços que sejam conformes a WS* standards como mensagens fiáveis e transações. ### Benefícios de Usar Web API em C# - Ideal para criar serviços RESTful. - Baseado no HTTP, um protocolo amplamente utilizado. - Suporta uma ampla gama de recursos de web modernos. - Simplifies complex tasks with built-in helper methods. - Reduces the amount of boilerplate code in comparison to WCF. ### Criando um Projeto Web API 1. Criar um novo projeto Visual Studio. 2. Selecionar Aplicação Web ASP. NET. 3. Selecionar Projeto de Web API vazio. 4. Nomeie o projeto e clique em Criar. 5. Configurar o projeto (opcional). 6. Criar um controller (API) com ações (métodos). 7. Configurar roteamento para mapear URLs para ações. Com este conhecimento básico, você poderá começar a criar seus próprios projetos WebAPI, integra-os em suas aplicações, e criar aplicações web escaláveis e acessíveis com facilidade. # Transaction e Segurança de Mensagem ## Introdução Neste tutorial, discutiremos o uso de `WCF` e `ASP. NET Web API` quando chegamos ao momento de escolher padrões de troca de mensagens e transações seguras. ### Motivos para Usar ASP. NET Web API 1. **Usando . NET Framework 4. 0 ou Superior**: Quando selecionarmos a Web API, é importante garantir que sua aplicação seja compatível com a versão . NET Framework 4. 0 ou superior. 2. **Suporte ao Protocolo HTTP**: Se pretender construir um servidor que ajuge o protocolo HTTP, a Web API é a opção ideal para criar serviços RESTful ou HTTP-based. 3. **Semelhança com ASP. NET MVC**: ASP. NET Web API partilha semelhanças com ASP. NET MVC, tornando-a uma excelente escolha para desenvolvedores já familiares com ASP. NET. ### Demonstração Prática de API Web C# #### Criando um Novo Projeto 1. Crie um novo projeto com o modelo de sintaxe Web Api `Asp. Net Core Wave Api` e chame-o `EmpApi`. 2. Instale o pacote NuGet `Microsoft. EntityFrameworkCore. Sqlite` para incluir suporte a Entity Framework Core e SQLite. #### Modelando os Dados 1. Crie uma pasta `Models` e adicionar um novo arquivo de classe chamado `Employee`. 2. Defina a classe `Employee` com as propriedades necessárias, inclusive um identificador único decorado com o atributo `[Key]`. ```csharp using System; using System. ComponentModel. DataAnnotations; namespace EmpApi. Models { public class Employee { [Key] public int EmpId { get; set; } public string Nome { get; set; } public string Departamento { get; set; } public string Endereço { get; set; } } } ``` 3. Crie outra classe chamada `EmployeeContext` para fornecer a configuração do objeto de contexto do Entity Framework Core. ```csharp using Microsoft. EntityFrameworkCore; namespace EmpApi. Models { public class EmployeeContext : DbContext { public EmployeeContext(DbContextOptions<EmployeeContext> options) : base(options) { } public DbSet<Employee> Employees { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder. UseSqlite("Data Source=employees. db"); } } } ``` #### Configurando o Repository 1. Crie uma pasta `Repositories` e defina uma interface `IEmpRepository` para representar as operações realizadas no banco de dados. ```csharp using System. Collections. Generic; using System. Threading. Tasks; namespace EmpApi. Repositories { public interface IEmpRepository { Task<IEnumerable<Employee>> GetEmployees(); Task<Employee> GetEmployee(int empId); Task CreateEmployee(Employee employee); Task UpdateEmployee(Employee employee); Task DeleteEmployee(int empId); } } ``` 2. Implemente a interface `IEmpRepository` na classe `EmployeeRepository`. ```csharp using System; using System. Collections. Generic; using System. Linq; using System. Threading. Tasks; using Microsoft. EntityFrameworkCore; namespace EmpApi. Repositories { public class EmployeeRepository : IEmpRepository { private EmployeeContext _context; public EmployeeRepository(EmployeeContext context) { _context = context; } public async Task<IEnumerable<Employee>> GetEmployees() { return await _context. Employees. ToListAsync(); } public async Task<Employee> GetEmployee(int empId) { return await _context. Employees. FindAsync(empId); } public async Task CreateEmployee(Employee employee) { _context. Employees. Add(employee); await _context. SaveChangesAsync(); } public async Task UpdateEmployee(Employee employee) { _context. Entry(employee). State = EntityState. Modified; await _context. SaveChangesAsync(); } public async Task DeleteEmployee(int empId) { var employeeToDelete = await _context. Employees. FindAsync(empId); if (employeeToDelete == null) return; _context. Employees. Remove(employeeToDelete); await _context. SaveChangesAsync(); } } } ``` #### Configurando o Controlador API Web 1. Crie uma nova pasta `Controllers` e adicionar um novo controlador chamado `EmployeesController`. 2. Herde a classe base `Controller` e adicionar as ações necessárias para manipulação de solicitações HTTP: `GetEmployees`, `GetEmployeeById`, `CreateEmployee`, `UpdateEmployee`, e `DeleteEmployee`. ```csharp using System. Collections. Generic; using System. Linq; using Microsoft. AspNetCore. Mvc; using EmpApi. Repositories; namespace EmpApi. Controllers { [Route("api/[controller]")] public class EmployeesController : ControllerBase { private readonly IEmpRepository _empRepository; public EmployeesController(IEmpRepository empRepository) { _empRepository = empRepository; } [HttpGet] public async Task<ActionResult<IEnumerable<Employee>>> GetEmployees() { return await _empRepository. GetEmployees(); } [HttpGet("{id}")] public async Task<ActionResult<Employee>> GetEmployee(int id) { var employee = await _empRepository. GetEmployee(id); if (employee == null) { return NotFound(); } return employee; } [HttpPost] public async Task<ActionResult<Employee>> CreateEmployee(Employee employee) { await _empRepository. CreateEmployee(employee); return CreatedAtAction(nameof(GetEmployee), new { id = employee. EmpId }, employee); } [HttpPut("{id}")] public async Task<IActionResult> UpdateEmployee(int id, Employee employee) { if (id ! = employee. EmpId) { return BadRequest(); } await _empRepository. UpdateEmployee(employee); return NoContent(); } [HttpDelete("{id}")] public async Task<IActionResult> DeleteEmployee(int id) { var employee = await _empRepository. GetEmployee(id); if (employee == null) { return NotFound(); } await _empRepository. DeleteEmployee(id); return NoContent(); } } } ``` Com estas etapas, criamos uma aplicação API Web simples utilizando C# e Entity Framework Core para gestão de funcionários. Feliz códificação! # Padrões de Design: Um Olhar para Padrões Estruturais e Comportamentais Esta sessão abordará dois tipos de padrões de design: Padrões Estruturais de Design e Padrões Comportamentais de Design. Vamos concluir com algumas desvantagens dos padrões de design. Vamos começar então! ## Padrões de Design Os padrões de design são soluções reutilizáveis para problemas comuns nos desenhos de software que aparecem regularmente no desenvolvimento de aplicações reais. São empregados pelos desenvolvedores para overcarregar os desafios em suas próprias designações. É mais importante entender os padrões de design do que memorizá-los. As necessidades individuais e desafios influenciam a seleção e o uso de inumeras opções de padrões de design. ## Tipos de Padrões de Design Existem três tipos principais de padrões de design: 1. **Padrões de Criação de Design**: Estes lidam com a criação e inicialização de objetos. Fornecem ao programador mais flexibilidade na decisão de quais objetos precisarem ser criados em um determinado caso. 2. **Padrões Estruturais de Design**: Estes padrões são usados para gerenciar a estrutura de classes e interfaces, além de gerenciar a relação entre as classes. 3. **Padrões Comportamentais de Design**: Estes padrões lidam com a comunicação entre classes e objetos, isto é, se você desejar mudar o comportamento de uma classe e que esta influência outras classes da aplicação, estes padrões são considerados práticos. ## Padrões Estruturais de Design Os padrões Estruturais de Design gerenciam a estrutura de classes e interfaces, além de gerenciar a relação entre as classes. Possuímos sete tipos de padrões de design em esta categoria: 1. **Adaptador**: O padrão Adaptador é um padrão Estrutural de Design que permite que itens com interfaces contraditórias possam trabalhar juntos. Utilizamos este padrão para reutilizar muitas classes existentes que possuem falta de funcionalidade e esta não pode ser adicionada à superclasse. 2. **Ponte**: Este padrão é um padrão Estrutural de Design que permite que você possa dividir uma grande classe ou uma coleção de classes relacionadas em dois hierarquias independentes: abstração e implementação. 3. **Composição**: O padrão de Composição permite que você possa organizar partes em árvores e manipular-as independente de cada outra. Este padrão fornece duas partes básicas com uma interface compartilhada: simples folhas e complexos containers. 4. **Decorator**: Decorator é um padrão Estrutural de Design que permite obter estruturas a partir de objetos por meio de envolver-los num objeto "wrapper". Este padrão utiliza a técnica decorativa para adicionar comportamentos adicionais aos objetos sem desorganizar o código que utilizam-nos. 5. **Fachada**: Para bibliotecas complexas, quadros de trabalho e interfaces de classe quando necessitamos de uma interface simplificada a um número complexo de sub sistemas, utilizamos o padrão de Fachada. 6. **Flyweight**: O padrão Flyweight é um padrão Estrutural de Design que permite que você repigente objetos na memória para minimizar o uso de recursos. 7. **Proxy**: O Proxy é um padrão Estrutural de Design que permite que você possa substituir um item sob controlo de um proxy controlar o acesso a um objeto de origem, permitindo-nos fazer ações antes e depois de uma requisição. ## Padrões Comportamentais de Design Os padrões Comportamentais de Design lidam com a comunicação entre classes e objetos. Possuímos dez tipos de padrões de design nesta categoria: 1. **Cadeia de Responsabilidade**: A cadeia de responsabilidade permite que voce possa passar requisições por uma cadeia de processadores quando uma requisição é recebida, cada processador determina se o processar ou enviar para o próximo processador da cadeia. 2. **Iterador**: Iterador permite que voce possa percorrer as componente de uma coleção sem revelar sua representação (por exemplo, lista, pilha, árvore, etc. ). Iteradores podem ser utilizados para percorrer árvores complexas. 3. **Memento**: O Memento salva e restaurar um objeto antes de alguma operação sem revelar a sua implementação quando você precisar "levar fotos" do estado de um objeto para armazenar na versão anterior, utilizamos o memento padrão. 4. **Estado**: O estado permite que uma entidade mude seu comportamento em resposta a mudanças em seu estado interno. Parece que a classe desta objeto tem mudado e, então, o padrão Template é utilizado. 5. **Template Método**: O Template Método permite que subclases possam alterar passos de um algoritmo sem alterar sua estrutura. Utilizaremos o template método para permitir que os clientes possam estender comportamentos específicos de um algoritmo e não toda a metodo ou sua estrutura. 6. **Comando**: Comando torna uma requisição em uma entidade autônoma. Esta transformação apoia operações anubláveis ​​e transmissão de requisições como parâmetros de método. 7. **Mediador**: O mediador reduz a dependência de objeto para que para que os objetos devem inicialmente se comunicar através de um objeto mediador. 8. **Observador**: O Observador permite que você possa estabelecer uma mecanismo de suscrição para alertar vários objetos em resposta a um evento que ocorre no objeto observado. 9. **Estratégia**: A Estratégia permite que você possa construir uma família de algoritmos, classificá-los, e tornar os objetos intercambiáveis. Quando você possui uma série de classes que apenas variam no modo em que eles executam algum comportamento, utilizamos o padrão padrão estratégia. 10. **Visitante**: O Visitante permite que você decouple algoritmos de objetos em que eles atuam quando necessariam executar uma operação em todos os elementos de uma estrutura complexa de objetos, utilizamos o visitante. ## Desvantagens dos Padrões de Design 1. Mesmo sendo flexíveis e reutilizáveis, os padrões de design podem ser complexos e difíceis de entender, especial aos iniciantes. 2. O excesso de uso de padrões de design pode levar a um design desnecessariamente complexo. 3. Os padrões de design podem não ser sempre aplicáveis em cada situação, é essencial entender quando utilizar eficientemente. # Delegados em C# Explicados | Tutorial de Delegados e Eventos em C# | Exemplo de Delegados em C# | Simplilearn ## Agenda 1. Definição de Delegados 2. Porque e Quando Utilizar Delegados 3. Declarando Delegados em C# 4. Inicializando e Invocando Delegados em C# 5. Tipos de Delegados em C# 6. Diferenças entre Delegados e Métodos Anônimos ## Idioma idioma: pt-PT ## Introdução Olá todos, bem-vindos ao canal do Simplilearn no YouTube! Nesta sessão, vamos discutir delegados em C#. Antes de começar, gostaria de dizer que temos atualizações diárias em várias tecnologias, então se você é um entusiasta da tecnologia em constante busca das últimas tendências tecnológicas, considere inscrever-se no nosso canal do YouTube e não esqueça de clicar no ícone de sino para não perder nenhuma atualização do Simplilearn. Agora, sem mais ado, vamos começar com a agenda para a sessão desta seção. ## Definição de Delegados Um delegado é um objeto que se refere a um método ou é uma variável de tipo de referência que pode conter uma referência a um método. Por exemplo, delegados em C# são análogos aos ponteiros de função em C++ ou C++. Fornece uma maneira de especificar qual método deve ser chamado quando um evento ocorre. Delegados são frequentemente utilizados para implementar eventos e métodos de chamada de retorno. Todos delegados são derivados implicitamente da classe `System. Delegate`. Aqui está um diagrama que mostra como delegados funcionam, que é totalmente semelhante a um ponteiro para uma função: ! [Diagrama de Delegados](https://i.imgur.com/CfzHhti.png) Em essência, um delegado é um tipo que representa referências a métodos com uma lista de parâmetros específica e tipo de retorno e, em seguida, chama o método quando necessário. Para uma melhor experiência de aprendizado, aqui está uma representação gráfica do exemplo dado: ! [Representação Gráfica do Exemplo](https://i.imgur.com/HlTp9Gg.png) ## Aspectos Essenciais de Delegados em C# * Delegados são uma boa maneira de encapsular métodos. * Delegados são uma classe de biblioteca encontrada no `System` namespace. * Delegados também podem ser usados para invocar métodos anônimos. * Delegados são principalmente usados para implementar métodos de chamada de retorno e eventos. * Como dois ou mais métodos podem ser chamados em um único evento, delegados podem ser encadeados juntos. * Delegados são despreocupados com a classe do objeto a que se referem. * Em alguns contextos, métodos anônimos de C# 2. 0 e expressões lambda de C# 3. 0 são compilados para tipos de delegado. Estas funcionalidades são algumas vezes referidas coletivamente como funções anônimas. ## Porque e Quando Utilizar Delegados Os programadores são frequentemente obrigados a passar um método como um parâmetro para outros métodos. Delegados são criados e usados para este propósito. Por exemplo, um delegado é uma classe que contém a assinatura de um método, embora possa ser usado em qualquer contexto, é frequentemente usado como a base do modelo de manejo de eventos de C#. Delegados podem ser pensados como dando um nome a assinatura de um método. Por # Lambda Expressões C# Tutorial | LINQ C# | C# Tutorial For Beginners | Simplilearn ## Agenda 1. **Introdução** - Explicação do conteúdo - Pré-requisitos 2. **Learn (LINQ)** - Explicação do que é Learn - Porque usar Learn - Como integrar Learn em seu projeto 3. **Lambda Expression** - Explicação do que é Lambda Expression - Sintaxe básica de Lambda Expression - Exemplos de Lambda Expression 4. **Async Lambda** - Explicação do que é Async Lambda - Sintaxe básica de Async Lambda - Exemplos de Async Lambda 5. **Lambda Expression em Operadores de Consulta padrão** - Explicação do que são Operadores de Consulta padrão - Como usar Lambda Expression em Operadores de Consulta padrão - Exemplos práticos 6. **Interface** - Explicação do que é Interface - Como definir uma Interface - Como usar Interface em seu código 7. **Ámbito de Variáveis** - Explicação do que é Ámbito de Variáveis - Como controlar o índice de escopo - Exemplos práticos 8. **Expression Tree** - Explicação do que é Expression Tree - Como usar Expression Tree - Exemplos práticos 9. **Expression Statement** - Explicação do que é Expression Statement - Como usar Expression Statement - Exemplos práticos 10. **Conclusão** - Resumo do conteúdo - Conclusão final --- ### Lambda Expressão C# Tutorial | LINQ C# | C# Tutorial For Beginners | Simplilearn URL: https://www.youtube.com/watch?v=K_62nX2z5As * Idioma: en Olá toda a gente, eu sou Ral e bem-vindo ao canal de vídeos Simplilearn! Hoje vamos falar sobre LINQ e Lambda expression, mas antes de começarmos, eu gostaria de dizer que nossos vídeos têm atualizações diárias em várias tecnologias, então se você for um entusiasta da tecnologia à procura de avanços tecnológicos mais recentes, então considere se inscrever no nosso canal YouTube e não esqueça de clicar no ícone Bell para não perder um atualizado do Simplilearn. Agora, sem mais ado, vamos começar com a agenda da sessão deste dia. Iniciamos com a discussão em torno do LINQ, depois vamos discutir a Lambda expression e Async Lambda. Depois disso, vamos olhar para Lambda nos Operadores de Consulta padrão. Agora, vamos nos aprofundar nos tipos Interface, escopo de Variáveis, Expressão Árvore e Expressão Statement. Finalmente, vamos concluir esta sessão com uma conclusão. Vamos começar com o LINQ. O LINQ é uma abreviação para Language Integrated Query. A linguagem de consulta Microsoft é completamente integrada e permite que você obtenha dados fáceis de acesso de objetos em memória, bancos de dados, documentos XML e muitas outras fontes. O LINQ unifica as consultas e C# e Visual Basic através de uma série de extensões. Agora, vamos discutir a Lambda expression. As expressões de função anônima são componentes executáveis de LINQ expression que traduzem lógica para enviar ao provedor de dados a execução em tempo de execução. Aqui estamos fornecendo a sintaxe básica de Lambda expression. Async Lambda é uma expressão de função anônima que usa a palavra-chave async para integrar o processamento assíncrono. Aqui está a sintaxe para imprimir "Simply Learn" usando programação assíncrona. Agora, vamos implementar isso no editor de código. ```csharp using System; using System. Collections. Generic; using System. Linq; using System. Text; using System. Threading. Tasks; namespace LambdaX { class Program { delegate int MyDelegate(int x); static void Main(string[] args) { MyDelegate myDelegate = (x) => x * x; // Lambda Expression int result = myDelegate(7); Console. WriteLine(result); } } } ``` Esse código vai imprimir o quadrado de 7, portanto deve imprimir 49. Agora, vamos voltar aos nossos slides. Agora, vamos falar sobre Lambda em Operadores de Consulta padrão. LambdaExpression em C# (ou Lambda Expressions em C\#), é uma expressão anônima que pode ser usada em C# para criar delegados ou expressões Árvore de Consulta, produzindo um código mais limpo e completa. Em esta seção, vamos aprender a criar expressões lambda em C# com exemplos práticos. ```csharp using System; using System. Linq; namespace LambdaTest { class Program { static void Main() { string[] nome = { "José", "Ana", "Maria", "Pedro", "BRANCO" }; var result = nome. Where((nome) => (nome ! = "BRANCO")). Select((x) => x. ToUpper()); foreach (var item in result) Console. WriteLine(item); } } } ``` Esse código irá filtrar todos os nomes que são diferentes de "Branco" e converterá para maiúsculo. O resultado final seria: ``` JOSE ANA MARIA PEDRO ``` Agora, vamos ver como fazer uma expressão anônima utilizando Fontes de Delegados. ## Exemplo de fontes de delegados: ```csharp using System; using System. Linq; namespace LambdaTest { class Program { static void Main() { int[] array = new int[] { 1, 2, 3, 4, 5 }; // Source int sum = array. Aggregate((a, b) => a + b ); Console. WriteLine("A soma de todos valores é : " + sum); } } } ``` Neste exemplo estamos usando a fonte Aggregate para somar os valores de um array. Em C++, podemos fazer a mesma coisa usando uma expressão lambda. Porém, C# não faz necessariamente tal comparação. C# utilizou apenas somar a soma. Isso não quer dizer que C# não confia em expressões lambda, apenas que em C# não é requerido. # Expressões Lambda em C# e Inferência de Tipo As expressões de lambda com operador de consulta avaliam-se a demanda e operam em cada elemento da sequência de entrada em vez da sequência inteira. Uma expressão de lambda permite a um desenvolvedor inserir sua própria lógica no operador de consulta usual. Vamos fazer um exemplo em que um desenvolvedor utilizar o operador `where` para recuperar os ímpares de uma lista fornecida com a ajuda de uma expressão de lambda. ## Exemplo de Código Aqui está o código de exemplo em C# onde uma expressão de lambda é usada para filtrar os números ímpares de uma lista fornecida: ```csharp using System; using System. Collections. Generic; using System. Linq; using System. Text; namespace ExpressaoLambdaExample { class Program { static void Main(string[] args) { List<int> números = new List<int>() { 1, 2, 3, 5, 8, 13, 21, 34 }; double media = números. Average(n => n % 2 == 1); Console. WriteLine($"Média: {media}"); } } } ``` Neste exemplo, a expressão de lambda é passada ao método `Average`, que aplica a lógica a cada número na lista `números` e calcula a média dos números ímpares. ## Inferência de Tipo A inferência de tipo é útil em muitas situações em C#. Ele permite omitir a declaração explícita do tipo quando usar uma expressão de lambda, fornecendo que cada tipo tenha sido fornecido como requisito do compilador. Aqui, a inferência de tipo do variável X deduz que ela é um inteiro ao investigar os argumentos de transmissão fornecidos abaixo: ```csharp números. Where(x => x % 2 == 1); ``` ## Scope de Variável As variáveis declaradas dentro de uma expressão de lambda não são visíveis em um método exterior. Se você utilizar o escopo de variável em uma expressão de lambda, existe uma exigência de que uma variável capturada não seja uma coleção garrafa, a menos que a delegate que a endereçe se torna elegível para coleta de lixo garrafa. Também é proibido utilizar uma instrução escrita dentro de uma expressão de lambda para forçar o retorno de um método englobante. ## Árvores de Expressão As expressões de lambda são frequentemente utilizadas no desenvolvimento de árvores de expressão. Uma árvore de expressão distribui o código em estruturas de dados como um árvore em que cada nó é uma expressão, como uma chamada de método ou uma operação binária como `x < y`. As expressões de lambda com dois ou três instruções também estão disponíveis, mas não são utilizadas na criação de árvores de expressão. Uma instrução RETURN deve ser expressa em uma instrução Lambda. --- ## Laços e Instruções de Iteração em C# Neste assunto, apresentaremos você aos diferentes tipos de laços em C#, incluindo `while`, `do-while`, `for`, `foreach`, `break`, `continue`, e `switch` instruções. ### Laço While O `while` é um dos laços mais simples e utilizados em C#. A condição do laço determina quantas vezes a linha de código do corpo será repetida. ```csharp int i = 0; while (i < 10) { // Corpo do laço i++; } ``` ### Laço Do-While O `do-while` é semelhante a um laço `while` mas ele verifica a condição após cada execução do corpo do laço. Este tipo de laço também é conhecido como laço com a condição no fim ou laço post-test. ```csharp int i = 10; do { // Corpo do laço i++; } while (i < 10); ``` ### Laço For O `for` é ótimo para iteração em uma coleção ou repetição de um bloco de código um número fixo de vezes. ```csharp for (int i = 0; i < 10; i++) { // Corpo do laço } ``` ### Laço ForEach O `foreach` é usado para iteração em coleções (arrays, listas, etc. ) e não requer conhecimento sobre as posições de índice. ```csharp List<int> números = new List<int>() { 1, 2, 3, 4, 5 }; foreach (int número em números) { // Corpo do laço Console. WriteLine(número); } ``` ### Declarações Break e Continue A declaração `break` é usada para interromper o laço atual de forma prémature antes de executar todas as declarações do laço. A declaração `continue` é usada para pular a iteração atual e passar para a próxima. ### Instrução Switch A `switch` é outra forma de laço que faz decisões baseadas em condições especificadas. ```csharp int valor = 2; switch (valor) { case 1: Console. WriteLine("Valor é 1"); break; case 2: Console. WriteLine("Valor é 2"); break; default: Console. WriteLine("Valor não é 1 ou 2"); break; } ``` # Cálculo de Fatorial ## Cálculo do Fatorial Usando Laços Do-While Iniciaremos inicializando o número de fatorial como 1 e depois executaremos um laço do-while para calcular o fatorial do número dado. Decrementaremos simultaneamente o número ao longo do processo. Quando o número `x` for determinado ser menor que 0, compararemos o fatorial com o número dado. Vamos executar este programa e verificar a saída. Forneça um valor para `x` (5 em vez de 1): ``` o fatorial de 5 é 120 ``` O laço do-while para o cálculo de fatorial funciona conforme o esperado. ## Laço For O laço For em C# é semelhante na funcionalidade ao laço while, mas a sintaxe é diferente. Quando as declarações de laços precisam ser executadas de antemão, os laços For são preferidos. A inicialização da variável do laço, a condição para ser testada e o incremento ou decremento da variável do laço são todos feitos em uma linha, resultando em uma estrutura de laços de repetição mais curta e fácil de depurar. Vejamos alguns exemplos: ### Ao elevar um número a um exponencial ```csharp int a = 2; int b = 3; // número base e exponencial for (int i = 0; i < b; i++) { a *= a; } Console. WriteLine($"{a} é a resposta"); ``` ### Laço For Each O Laço For Each em C# itera por uma coleção de itens, por exemplo, um array ou uma lista. Quando cada laço for executado, ele executa um bloco de código em cada item da coleção e os exibe um a um. ```csharp int[] números = { 2, 4, 6, 8, 10, 12, 14, 16 }; string[] nomeDeCidades = { "Londres", "Paris", "Estados Unidos", "Nova York" }; foreach (var número in números) { Console. WriteLine(número); } foreach (var cidade in nomeDeCidades) { Console. WriteLine(cidade); } ``` seguindo Laços aninhados em C#: Laços aninhados em C# são construções de programação compostas de vários laços aninhados um dentro do outro. O laço mais interno é executado mais frequentemente, enquanto o laço mais externo é executado mais raramente. Exemplo de impressão de triângulo em uma aplicação de console com uma coleção For Each: ```csharp void ImprimirTriângulo(int x) { for (int row = 1; row <= x; row++) { for (int column = 1; column <= row; column++) { Console. Write("#"); } Console. WriteLine(); } } ImprimirTriângulo(5); ``` O código acima cria um triângulo direito com símbolos "#". ## Instrução Continue A instrução `continue` permite continuar a execução do laço depois que a expressão condicional for executada, saltando o resto do laço para a próxima iteração em um laço condicional, como um Laço De, Laço While ou Laço For Each. Aqui está um exemplo de uso `continue`: ```csharp for (int i = 1; i <= 20; i++) { if (i % 9 == 0) { continue; } Console. WriteLine(i); } ``` Esse código imprime os números ímpares de 1 a 20 que não são múltiplos de 9. ## Instrução Break A `break` instrução é utilizada no final de um laço for. Em caso de a `break` instrução estiver presente, o controle é passado a instantaneamente as declarações que se seguem a um laço, se a `break` instrução estiver presente dentro de um laço aninhado, ela termina apenas o laço que contém a `break` instrução. A sintaxe é simples: `break; `. Aqui está um exemplo de uso `break` com um laço aninhado: ```csharp for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i; j++) { Console. Write("*"); if (i == 3) { break; } } Console. WriteLine(); } ``` Esse código imprime uma pirâmide de " *" até uma altura de 5, mas para antes do terceiro, linha. ## Instrução Switch A `switch` instrução em C# é uma instrução múltipla-ramificada que oferece uma forma eficiente de transferência de execução para diferentes partes de código baseado no valor da expressão. A expressão do `switch` é do tipo inteiro, caractere, byte, curto, enumeração ou string. Aqui está um exemplo de uso de uma `switch` instrução: ```csharp string input = Console. ReadLine(). ToLower(); switch (input) { case "a": case "e": case "i": case "o": case "u": Console. WriteLine("vogal"); break; default: Console. WriteLine("consoante"); break; } ``` Esse código pergunta ao usuário qual a entrada e em seguida, verifica se é uma vogal ou uma consoante. ## Tutorial de Arrays em C# | Tutorial de C# Para Iniciantes | Como Programar Arrays em C# | Tutorial de C# ### Agenda 1. Introdução aos Arrays em C# 2. Tipos de Arrays em C# e sua implementação 3. Vantagens e Desvantagens de Arrays em C# 4. Arrays Multidimensionais 5. Arrays Arelados 6. Resumo 7. Declarações Condicionais em C# --- ## Arrays em C# Um array em C# é uma coleção de elementos do mesmo tipo de dados que estão armazenados em locais de memória consecutivos. No C#, o índice de erro começa em zero e podemos armazenar apenas um número fixo de elementos em um array. ### Array Unidimensional Para criar um array unidimensional, utilizamos o operador `new` e colchetes após um tipo. ```csharp using System; public class ArrayExample { public static void Main(string[] args) { int[] arr = new int[5]; arr[0] = 10; arr[1] = 15; // . . . for (int i = 0; i < arr. Length; i++) Console. WriteLine(arr[i]); } } ``` ### Arrays Multidimensionais Um array multidimensional é dividido em duas partes adicionais: matriz em 2D e matriz em 3D. Para criar uma matriz em 2D multidimensional, precisamos utilizar vírgula dentro dos colchetes. ```csharp using System; public class MultiArrayExample { public static void Main(string[] args) { int[, ] arr = new int[2, 3]; arr[0, 0] = 1; arr[1, 0] = 2; arr[0, 1] = 3; arr[1, 1] = 4; // . . . for (int i = 0; i < arr. GetLength(0); i++) { for (int j = 0; j < arr. GetLength(1); j++) Console. Write(arr[i, j] + " "); Console. WriteLine(); } } } ``` ### Arrays Arelados Um array arelado é referenciado como um array de arrays, visto que cada um de seus elementos é um array individual e seu tamanho pode variar. ```csharp using System; public class JaggedArrayExample { public static void Main(string[] args) { int[][] arr = new int[2][]; arr[0] = new int[3]; arr[1] = new int[4]; arr[0][0] = 1; arr[0][1] = 2; arr[0][2] = 3; arr[1][0] = 4; arr[1][1] = 5; arr[1][2] = 6; arr[1][3] = 7; // . . . foreach (int[] row in arr) { foreach (int item in row) Console. Write(item + " "); Console. WriteLine(); } } } ``` ## Declarações Condicionais em C# As declarações condicionais em C# fornecem capacidade de tomada de decisão para lógica de aplicação. ### If Else If ```csharp using System; public class ConditionalStatementExample { public static void Main(string[] args) { int value = 15; if (value == 10) Console. WriteLine("O valor é 10"); else if (value == 15) Console. WriteLine("O valor é 15"); else Console. WriteLine("O valor não é 10 ou 15"); } } ``` --- Tabela de Conteúdos ------------------- 1. [Tutorial de Arrays em C#](#tutorial-de-arrays-em-c-sharp) 1. 1. [Introdução aos Arrays em C#](#introdução-aos-arrays-em-c-sharp) 1. 2. [Tipos de Arrays em C# e sua implementação](#tipos-de-arrays-em-c-sharp-e-sua-implementação) 1. 3. [Vantagens e Desvantagens de Arrays em C#](#vantagens-e-desvantagens-de-arrays-em-c-sharp) 1. 4. [Arrays Multidimensionais](#arrays-multidimensionais) 1. 5. [Arrays Arelados](#arrays-arelados) 1. 6. [Resumo](#resumo) 2. [Declarações Condicionais em C#](#declarações-condicionais-em-c-sharp) 2. 1. [If Else If](#if-else-if) Referências ----------- - [Arrays em C#](https://www.geeksforgeeks.org/c-sharp-arrays/) - [Arrays em 2D em C#](https://www.geeksforgeeks.org/2d-arrays-c-sharp/) - [Arrays Arelados em C#](https://www.geeksforgeeks.org/jagged-arrays-c-sharp/) - [Declarações Condicionais em C#](https://www.geeksforgeeks.org/if-else-structure-in-c-sharp/) - [Declarações Condicionais - If Else Statement em C#](https://www.programiz.com/csharp-programming/if-else) # C# Branching Statements: If-Else e Switch Case **If-Else Declaração** A declaração `if` é composta por uma expressão boolean seguida por uma declaração. A declaração internamente à condição do `if` somente será executada se a expressão boolean retornar `true`. Se ela retornar `false`, então o programa simplesmente executará o `else` statement se estiver disponível. Abaixo segue um diagrama para ajudar a visualizar a execução: ``` +------------+ | | | if(bool) | | | +-------------+ | | Declaração | | v +-------------+ | | |else | | | +-------------+ ``` Tente um exemplo: ```markdown comecemos com o grau, `x`, comentário, `y` depois consentir linha, imprimindo: "Entre com o número" Agora, obtenha uma entrada do usuário: `x` é igual a `console. parse ()`, teremos `console. redline`, isso solicitará a entrada de `x` Copie e cole a mesma função para `y` Agora, escreva uma declaração if-else: - Se `x` for maior que `y`, no caso, imprima: "`x` é maior que `y`" - Ir para outra condição (else) - Se temos `x` sendo menos que `y`, agora, neste caso, imprima: "`y` é maior que `x`" Diga-lhe que eles são iguais Pois ja abordamos as partes "maior que" e "menor que", então só condição restante é `igual` Então apenas escrevamos `else` e imprima: " conceder" Grave-o e execute-o Entre com o valor 7 e 5 Aqui ela imprime: "`x` é maior que `y`" Tente o operador "igual" também Dê-lhe o valor como 3 e 3 E prontamente imprime: "os dois são iguais" ``` **Declaração Switch Case** Neste cenário, temos vários casos, com um case `default` cada caso numerado, começando em 1 até `n` (exceto o default caso). No início, é solicitado a escolha de um número. Quer que número a pessoa escolher, o programa executará o mesmo número do caso. Se não houver o caso escolhido, irá executar o `default` caso. ```markdown Tente este statement no editor de código: Iniciemos com o inteiro `x` Em seguida, definiremos a função: `public void SwitchCase()` Aqui, escreva: `console. write line` Escolhamos uma cor: Vermelho Agora, tenhamos um switch statement: `switch` com o argumento como `x` Tendo o primeiro caso: `console. write line`, imprimindo "Você escolheu vermelho" Pode haver outro caso com o número 2: Dizendo: `console. write line`, "Você escolheu azul" Esses break statements servirão basicamente para sair deste `switch case` ``` [Continuar a discussão. . . (código, conclusão)] --- I translated and formatted the text to follow your guidelines, using Portuguese as the target language and preserving all Markdown formatting. I used Markdown syntax for emphasizing the text, creating lists, and for code blocks where necessary. I also excluded external links in this example, as they were not part of the provided text. If you would like me to include them in the output, please specify the specific links you would like me to add. # Documentação Técnica Markdown Formatted ## Introdução Este documento fornece uma explicação e exemplos de diversas operações e conceitos em programação, principalmente focados em C# e Java. ### C# vs Java: Qual é melhor? Nesta seção, vamos comparar e contrastar C# e Java, duas linguagens de programação populares usadas para desenvolvimento de software e produtos. #### C# O C# é uma linguagem de programação orientada a objetos desenvolvida pela Microsoft como parte do Framework . NET. Suas características incluem: - Tipagem forte - Imperativa - Declarativa - Programação orientada a objeto - Programação componente orientada O C# foi criado pela Microsoft sob a direção de Anders Hejlsberg e sua equipe. #### Java O Java também é uma linguagem de programação orientada a objetos e multiuso que suporta sete estilos de programação, incluindo o orientado a objetos. É utilizado para criar sistemas operativos, navegadores, jogos, etc. ### Diferenças entre C# e Java Abaixo estão algumas diferenças importantes entre C# e Java, de acordo com diversos parâmetros: #### Gestão de Memória - C#: A gestão da memória é cuidada pelo coletor de lixo. - Java: A gestão da memória é feita manualmente pelo programador. #### Dependência de Plataforma - C#: O código é somente compatível com Windows, mas a Microsoft está tentando fazê-lo em sistemas significantes. - Java: O código é portátil e pode ser executado em qualquer plataforma. #### Herança Múltipla - C#: Não apoia herança múltipla a partir de classes. - Java: Apóia herança múltipla através de interfaces. #### Checking de Bounds - C#: O compilador executa o checamento de erro para arrays para evitar o acesso acidental a índices de array inválidos. - Java: Não é feito check de bounds pelo compilador, resultando em saídas incorretas se é acessado um índice de array inválido. #### Ponteiros - C#: Pode ser utilizado ponteiros em "modo seguro, " mas não é apoiado pelo compilador aritmética de ponteiros padrão. - Java: Os ponteiros são pouco usados devido a preocupações de segurança e falta de suporte para aritmética de ponteiro. #### Tipo de Linguagem - C#: É uma linguagem de programação orientada a objeto de alto nível com uma hierarquia simples e um rico conjunto de funções e tipos de dados da biblioteca. - Java: É uma linguagem de programação de baixo nível com características mais complexas, como alocação de memória dinâmica. #### Tipo de Aplicativo - C#: É usado para diversas aplicações, como mobile, aplicações de computador Windows e aplicações de linha de comando. - Java: Geralmente utilizado para o desenvolvimento de aplicações console, mas também pode ser utilizado para outros fins como o desenvolvimento do Android. #### Resultado da Compilação - C#: Translacionado em um código intermediário linguagem, traduzido utilizando em ASP. NET em tempo de execução (JIT), enquanto nos aplicações do . NET o código compilado é convertido em código nativo. - Java: É traduzido em código máquina após a tradução. #### Características Orientadas a Objeto - C#: Suporte à encapsulação, polimorfismo e herança que são reforçados pela pl # Joguinho Infinito do T-Rex - Programação de Jogo em C# Este tutorial irá guiar você através da criação de um jogo infinito do T-Rex, utilizando uma aplicação na Windows. O jogo apresentará um T-Rex animado que pode saltar sobre obstáculos e acumular uma pontuação, com a opção de pressionar 'T' para continuar ou reiniciar o jogo. ## Visualização ! [Visualização do Joguinho Infinito do T-Rex](t-rex-runner-game-preview. png) ## Bibliotecas Sistema As seguintes bibliotecas do sistema e conjuntos de nomes serão utilizados neste projeto: - `System`: Fornece classes úteis e funções como Console e Função de Direita, ou Método. - `System. Collections. Generic`: Uma coleção fortemente tipada que pode armazenar apenas um tipo de objeto, para eliminar comportamentos de desarmonização a tempo de execução e melhorar o desempenho evitando unboxing e boxing. - `System. ComponentModel`: Inclui classes e componentes implementados, para comportamentos durante a execução e projeto em tempo de design. - `System. Data`: Permite a uma classe implementar um adaptador de dados e representar uma série de métodos e propriedades de mapeamento de ação-relacionadas utilizadas para preencher e atualizar um conjunto de dados útil e atualizar uma fonte de dados. - `System. Drawing`: Contém classes que compõem a Arquitetura de Gráficos do Próximo Geração da Microsoft (GDI+). - `System. Text`: Fornece suporte para codificação de caracteres, classes abstratas de base para a conversão de blocos de caracteres para e de blocos de bytes, e uma classe auxiliar que manipula e formata objetos de string sem criar instâncias intermediárias de string. - `System. Threading. Tasks`: Fornece tipos que fazem a escrita de código concorrente e assíncrono mais fácil. - `System. Windows. Forms`: Windows Forms como uma biblioteca de classe de interface do usuário gráfica para aplicativos de escritório, tablet e pc, também conhecido como WinForms. ## T-RexRunner Form Aqui está uma descrição detalhada da forma T-RexRunner com algumas variáveis chave e funções: ```csharp public partial class T-RexRunner { // Defina variáveis bool jump; // Determina se o jogador está saltando int jumpingSpeed = 10; // Velocidade a que o T-Rex salta int frc = 12; // Força usada para determinar a altura de salto int score = 0; // Pontuação do jogo int obstacleSpeed = 10; // Velocidade inicial dos obstáculos Random rand; // Gerador de números aleatórios int pos; // Posição do T-Rex bool gameOver = false; // Indica se o jogo acabou // Inicializa Componentes public T-RexRunner() { InitializeComponent(); } // Função de reiniciar executada quando o jogo começa private void ResetGame() { // Funções de reiniciar() serão definidas mais tarde } // Evento vinculado ao cronômetro do jogo private void Timer_Tick(object sender, EventArgs e) { // Lógica da loop do jogo } } ``` ## Funções Nesta seção, o código para o jogo do T-Rex infinito será fornecido: - `Jump`: Gerencia o comportamento de salto do T-Rex - `GenerateObstacles`: Gera obstáculos e os move para a esquerda da tela - `CheckCollision`: Verifica colisões entre o T-Rex e obstáculos - `IncreaseScore`: Incrementa a pontuação ao T-Rex passar por um obstáculo - `CheckGameOver`: Verifica se o jogo acabou, e reinicia o jogo se o jogador pressionar 'T' ## Controles - `SpaceKeyPressed`: Gerencia o evento de pressão da tecla de barra de espaço para que o T-Rex saia - `Restart`: Gerencia o evento de pressão de tecla para reiniciar o jogo ## Conclusão Este tutorial irá orientá-lo a criar um jogo infinito do T-Rex em C#. À medida que se avança neste tutorial, terá um jogo funcional em que o usuário controla um T-Rex que navega pelo paisagem infinita, saltando sobre obstáculos para atingir uma pontuação mais alta. [Referência](https://www.youtube.com/watch?v=RqO-y3hCR1s) --- **Importante: ** Note que este é um pedaço de código que pode não ser um jogo funcional ao todo. Você talvez precise adicionar mais código e modificar algumas partes para obter um jogo funcional. Este tutorial tem a finalidade de propósito educacional. O código poderá também utilizar funções e métodos personalizados não explicados neste bloco. É recomendado revizionar o tutorial original do vídeo para uma compreensão mais completa do código. # Criando Obstáculos para o Jogo Este guia irá detalhar o processo de criação de obstáculos para um jogo usando Markdown. ## Cubo preto mate (Obstáculo 1) Começaremos criando um cubo preto mate, dando à ele uma cor preta. Nomearemos-o `ospressed-dash-cube1` (Obstáculo 1). Como nossa obra com este obstáculo já foi concluída, escondemos-o. ```markdown - Cubo preto mate (Obstáculo 1 - ospressed-dash-cube1) - Cor: Preto - Dimensões: 1 (Altura), 5, 8 (Largura), 2 (Comprimento) - Localização: TBD ``` ## Cubo amarelo (Obstáculo 2) Em seguida, criaremos um cubo amarelo para o Obstáculo 2, posicionando-o apropriadamente com uma pequena distância para que o jogador possa agachar-se e evitar-lo. ```markdown - Cubo amarelo (Obstáculo 2 - we3) - Cor: Amarelo mais escuro - Dimensões: TBD - Localização: TBD ``` ## Cubo matte violeta (Obstáculo 3) Para o Obstáculo 3, teremos uma cópia do cubo amarelo mas com um buraco no meio, permitindo ao jogador agachar-se ou pular sobre ele. ```markdown - Cubo matte violeta (Obstáculo 3) - Cor: Violeta mate - Dimensões: TBD - Localização: TBD ``` ## Combos (Obstáculos 4, 5, e 6) Criaremos combos para os seguintes obstáculos utilizando elementos de Obstáculos 1 e 2: - Obstáculo 4: Combo do Obstáculo 1 (Cubo preto mate) e Obstáculo 2 (Cubo amarelo) - Obstáculo 5: versão modificada do Obstáculo 3 (Cubo violeta mate) - Obstáculo 6: Combinação do Obstáculo 3, colocado em um cubo mais grande ```markdown - Obstáculo 4: Como do Obstáculo 1 e Obstáculo 2 (Obstáculo 4) - Obstáculo 5: Versão modificada do Obstáculo 3 - Cubo violeta mate (Obstáculo 5) - Obstáculo 6: Combinação do Obstáculo 3 em um Cubo maior (Obstáculo 6) ``` ## Scripts para Gerenciamento de Pool de Objetos e Ativação Por fim, seremos obrigados a scripts para gerenciar o pool de objetos e ativação de obstáculos para criar uma plataforma infinita: - `synth_platform. cs`: Gerenciamento de pool de objetos e ativação de obstáculos - `simple_ground. cs`: Gerador de solo simples para a plataforma infinita # Tela de Game Over e Simplificação Gerador de Chão Esta documentação explica como criar uma tela de game over e um gerador de chão simplificado para um jogo de plataforma no Unity. ## Tela de Game Over 1. Em primeiro lugar, crie um prefab `GameOverCanvas` novo com uma UI Canvas e uma Image em Linha. Ajuste o tamanho da Image em Linha de acordo com as suas necessidades. 2. Em seguida, na script `GameOverManager`, adicione uma referência para o prefab GameOverCanvas e uma método para exibir a tela de game over: ```csharp public GameOverCanvas gameOver canvas; public void ExibirTelaGameOver() { canvas. gameObject. SetActive(true); } ``` 3. Chame este método quando o jogo terminar, por exemplo, quando o jogador colidir com uma obstáculo com a tag "Finish". ## Simplificação Gerador de Chão 1. Crie um objeto vazio chamado `SimpGroundGenerator`. Adique a script `SimGround Generator` a ele. 2. Modifique o método `Start()` da script para definir a posição e rotação da câmara principal: ```csharp void Start() { transform. position = new Vector3(10, -9, 0); transform. eulerAngles = new Vector3(0, -55, 0); } ``` 3. Crie outro objeto vazio chamado `StartPoint` e positione-o em (0, -2, -15). Atribua este objeto como o ponto de partida no script SimpGroundGenerator. 4. Por fim, adicione a script `SimGroundChain` ao objeto SimpGroundGenerator. Esta script gera uma plataforma com obstáculos e cria uma cadeia de chão. Com estas alterações, você deveria ter uma tela de game over e um gerador de chão simplificado funcionando para seu jogo de plataforma. 