Técnicas avançadas de programação C # | Dániel Ernő Szabó | Skillshare

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Técnicas avançadas de programação C #

teacher avatar Dániel Ernő Szabó, Pythonista in the making

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução avançada C #

      0:47

    • 2.

      C # Avançou A Configuração

      1:32

    • 3.

      C# Advanced Lógica e Bitwise

      7:05

    • 4.

      C# Avançado Const vs somente leitura

      6:18

    • 5.

      Âmbito e visibilidade avançadas C #

      8:29

    • 6.

      C # Avançado inseguro

      8:02

    • 7.

      C# Coleções Genéricos Avançadas

      10:21

    • 8.

      C # Advanced Explicit vs Conversões Implícitas

      6:50

    • 9.

      Funções com expressões avançadas C #

      7:50

    • 10.

      C# precedência avançada do operador

      3:01

    • 11.

      Pontos de entrada e saída do método avançado C #

      4:14

    • 12.

      Restrições de parâmetros C# Advanced Genéricos

      8:04

    • 13.

      C # Avançado Abrir e Fechado tipos genéricos

      7:48

    • 14.

      Parâmetros e descarte avançados do C #

      7:47

    • 15.

      Diretivas avançadas de pré-processador C #

      8:29

    • 16.

      Índices de Sobrecarga Avançada C #

      13:23

    • 17.

      Atributos pré-definidos comuns avançados em C #

      14:05

    • 18.

      C# Avançado Leia only somente para leitura

      6:16

    • 19.

      Síntaxe avançada para literais

      7:20

    • 20.

      Como retornar avançadas referências lidas apenas a partir de funções

      9:18

    • 21.

      Método avançado de C # sem um nome

      8:52

    • 22.

      C # Advanced LINQ

      8:54

    • 23.

      Interpolação de cadeias de caracteres avançadas C #

      7:19

    • 24.

      Valor avançado C # e atribuição de tipos de referência

      10:41

    • 25.

      Operador avançado de propagação da Nula

      6:14

    • 26.

      C# Clojures Avançados e expressões da lambda

      7:57

    • 27.

      C # Avançado Foreach e enumeradores

      6:52

    • 28.

      C # Advanced Static vs membros de instâncias

      7:40

    • 29.

      Inferência de tipo avançado C #

      7:00

    • 30.

      Funções locais avançadas

      9:02

    • 31.

      C# Advanced Custom accessors de eventos

      9:16

    • 32.

      Conversões definidas por usuário avançado C #

      6:22

    • 33.

      C # Avançou o Fim

      1:05

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

58

Estudantes

--

Projetos

Sobre este curso

Bem-vindo,

Este é o curso do meu curso anterior de C# onde técnicas de programação mais avançadas são discutidas e mostram como usar o idioma.

A linguagem de programação C # foi projetada pela Anders Hejlsberg da Microsoft em 2000 e foi posteriormente aprovada como padrão internacional pela Ecma (ECMA-334) em 2002 e pela ISO/IEC
(ISO/IEC 23270) em 2003. A Microsoft introduziu o C# junto com . NET Framework e Visual Studio, ambos com código fechado.
Na época, a Microsoft não tinha produtos de código aberto. Quatro anos depois, em 2004, um projeto gratuito e de código aberto chamado Mono começou,
fornecendo um compilador de plataformas e ambiente de execução para a linguagem de programação C#.
Uma década depois, a Microsoft lançou o Visual Studio Code (editor de código), Roslyn (compilador) e o unificado. Plataforma NET (estrutura de software),
todas elas suportam C# e são gratuitas, de código aberto e multiplataforma. Mono também se juntou à Microsoft, mas não foi mesclado com . NET.A partir de 2021, a versão mais recente do idioma é o C#

10.0, que foi lançado em 2021 em . NET 6.0.

Este curso vai criar o conhecimento para você criar suas próprias aplicações C# com facilidade.

Feliz Codificação!

Conheça seu professor

Teacher Profile Image

Dániel Ernő Szabó

Pythonista in the making

Professor

Hello, I'm Dániel Ernő.

I currently work as a devops engineer. I have several years of experience with various platforms and I'm here to teach some advanced techniques which may attribute your job security ;)

Cheers,

Daniel

Visualizar o perfil completo

Level: Beginner

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução avançada C #: Olá e bem-vindo ao meu curso e tópicos avançados em C sustenido. Nesta série de vídeos, falaremos sobre os detalhes do curso ou aula anterior e continuaremos nossa jornada para dar uma olhada nos conceitos avançados em C-Sharp. E este curso será acompanhado de um repositório Git, que permitirá que você aprofunde seu conhecimento, reproduza os exemplos. Então, se você quiser aprender algo mais complexo e em C sustenido, então este curso será ideal para você. Vejo você na próxima. 2. C # Avançou A Configuração: Olá e bem-vindo de volta. Neste pequeno vídeo, vamos ver o ambiente no qual você pode acompanhar os exemplos. Então, basicamente, você tem duas opções. Uma é que você pode usar com o Visual Studio apressado, você pode usar a 29ª versão ou a versão 2022. Você pode baixá-lo do lado oficial da Microsoft. E basicamente, o que você precisa fazer é abrir o Instalador do Visual Studio. E você pode clicar em modificar. Aqui. Você precisa ter o desenvolvimento do dotnet verificado e instalado. Depois de instalar isso, você poderá acompanhar. Essa é uma opção. A outra opção que você pode usar é o Visual Studio Code. E o Visual Studio Code, você pode verificar as extensões e verificar se há Dó sustenido. Isso é um pouco lento. Mas, basicamente, se você instalar essa extensão, também ficará bem. Então isso é tudo que eu estou usando, basicamente uma máquina Windows. E é isso aí. Vejo você na próxima. 3. C# Advanced Lógica e Bitwise: Olá e bem-vindo de volta. Neste vídeo, vamos nos segurar. Vamos falar sobre operadores lógicos e bit a bit e como você pode usá-los. Tão lógico e sábio. Tudo bem, vamos criá-lo. Então, basicamente, quando falamos sobre operadores lógicos e bit a bit e C-sharp, C-sharp suporta quatro tipos principais de operações que são agrupadas com base na ideia por trás de sua existência. Portanto, as categorias são aritmética, relacional, lógica, atribuição bit a bit e algumas operações diversas. Os operadores aritméticos geralmente realizam operações em dois números. Então você quer somar dois números, multiplicar, dividir e assim por diante. Os operadores relacionais são usados para comparar ou Chegg, qualidade do objeto ou objetos de entrada. E os operadores lógicos nos permitem comparar um pouco de um determinado objeto e sempre retorna um booleano como resorts. Portanto, seja verdadeiro ou falso, os operadores bit a bit executam a operação em bits individuais e os resultados são sempre bits. E os operadores de atribuição nos permitem inicializar um objeto com um valor para realizar uma operação específica. E há também outro conceito importante que é a precedência do operador, cujos operadores são mais fortes do que os outros. E isso mostra a lógica de como expressões complexas são avaliadas. Então, se quisermos dar uma olhada nos operadores lógicos, podemos fazer o seguinte. Vamos adicionar a chave certa no final. E poderíamos dizer que temos um booleano a, que é verdadeiro, e o booleano b que é falso. Poderíamos usar a linha certa do console para verificar se qual é o valor de a e B. Ou podemos verificar o valor de ohms ou linha direita A ou B, e assim por diante. Se começarmos ou executarmos, podemos ver que a e B são falsos e a ou B são verdadeiros. Então, quando estamos falando sobre o operador final, temos que saber que a condição é verdadeira quando ambas as entradas são verdadeiras, caso contrário, é falsa. A condição no caso de operadores OR, a condição é verdadeira quando um deles é verdadeiro, caso contrário, é falso. Então isso talvez seja sobre os operadores lógicos e temos negação. E se você usar o ponto de exclamação antes da variável, ela não obterá seu valor. Então nós definimos a s true, e aqui se negarmos true, nós obtemos false. Agora, o que também podemos verificar são os operadores bit a bit. Portanto, podemos ter um array int que será seis. E vamos chamá-los de C e D. E o D será 17. Então, se quisermos usar os operadores bit a bit, o que podemos fazer é o seguinte. Então, poderíamos usar o convert to string. Essa é uma função que permite converter uma string. E poderíamos dizer que a ou B. E também podemos usar os dois aqui. Então, deixe-me verificar. Então converta para a string a ou B. E se formos, espere, é C ou D. Tudo bem? Então, basicamente, quando usamos o operador OR, age como se tivéssemos alguns desses dois números. Portanto, temos o valor de 23. E poderíamos ter, Vamos verificar apenas duas vezes a representação desses números. Então, seis é 0000110. E nós temos o 17, que vai ser zeros, zeros 010001. E também podemos usar a operação AND aqui. Se o executarmos, obtemos esse valor. E você sabe, quando olhamos para a operação final, obtemos uma. Se em ambos os casos houve um, caso contrário, obtemos 0. É por isso que obtemos zeros. Resultado porque nenhuma dessas colunas se alinha para obter o valor um. E podemos usar o operador AND bit a bit. Então isso se parece com isso. E isso é menos sete. E poderíamos usar o operador OR bit a C ou D. E isso nos dá 23. E tecnicamente é isso. Isso é o que eu queria mostrar a vocês neste vídeo. Vejo você. 4. C# Avançado Const vs somente leitura: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre a diferença entre custo e somente leitura. C sustenido. C sustenido facilita palavras-chave como somente concentrado ou até mesmo somente leitura estática. E isso pode ser confuso no início. Temos que conhecer as pequenas diferenças entre eles. Portanto, a palavra-chave const nada mais é do que uma constante. Então, por exemplo, no custo string, minha string. E podemos dizer que isso é uma corda. E vamos mudar isso para aspas duplas. Tudo bem? Agora está reclamando que foi atribuído, nunca usado, mas tudo bem. Portanto, por padrão, se não dermos um valor a essa string constante, ela nos dará um erro porque ela deve ser inicializada. É por isso que está sublinhado em vermelho. Mas depois de darmos valor, tudo ficará bem. E primeiro, quando definimos a função constante, é basicamente uma exceção a isso. Então, por exemplo, se você tiver um teste de string estática, e poderíamos dizer que temos um valor de teste de string constante e o retorno. Então, basicamente, temos que escrever a minha restrição e a linha certa do console. Isso vai usar telefones com todas as três teclas. Para que possamos ter o prompt, vamos executá-lo. O valor das constantes não pode mudar durante a execução. Recentemente, a palavra-chave é um modificador especial que tem muita semelhança com a palavra-chave constante. E pode ser usado em campos, mas não em variáveis locais. Portanto, esses campos podem ser inicializados quando declarados, quais são os construtores do nosso objeto? E essa palavra-chave garante que a instância ou propriedade da variável de um objeto não possa ser modificada após a inicialização. E essa tentativa resultará em uma exceção de isenção. E por que as constantes nele são inicializadas em tempo de compilação. A palavra-chave somente leitura permite que as variáveis sejam inicializadas em tempo de compilação ou em tempo de execução. Então, poderíamos ter a coluna pública de string somente leitura de Mike para compilar nela. E podemos simplesmente deixar como está. Então, por exemplo, poderíamos ter como um aluno da turma. E essa classe pode ter a string pública somente leitura, nome completo. E o nome público da cadeia de caracteres do aluno. Nome completo é igual a nome. E se você for ao principal, podemos criar nosso aluno. Em seguida, ER e New Student, e use a linha direita do console para imprimir a danielle para o nome. E agora podemos ver a saída. Está lá. A principal diferença no nível mais alto se quisermos diferenciar a palavra-chave somente leitura e const. Portanto, poderíamos dizer que a diferença está em quando o valor da variável é conhecido durante o ciclo de vida da aplicação. Para a palavra-chave read-only, o valor é conhecido mais recente pelo tempo de execução, que para a palavra-chave const, o valor deve ser conhecido pelo tempo de compilação. O comum dessas palavras-chave é que ambas abrangem tipos de dados imutáveis, significa que o valor não pode mudar ao longo da vida útil do aplicativo. Para a palavra-chave const, a variável marcada como tal é colocada pelo compilador nos metadados do assembly que define a constante e os metadados e incorpora o valor ao código da linguagem intermediária. após a inicialização. Isso significa que não há alocação de memória além de quatro constantes durante o tempo de execução sob o capô, o valor somente leitura não é uma constante. Ele é armazenado na pilha do carregador, que é um tipo memorial que não pode ser alocado até que o tipo seja carregado. Então, tecnicamente, isso era tudo que eu queria te dizer. Vejo você na próxima. 5. Âmbito e visibilidade avançadas C #: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre escopo e visibilidade. Portanto, esses são conceitos muito cruciais ou basicamente cruciais para entender. E a maioria das linguagens de programação por aí incorporam esse conceito. O layout, a estrutura na qual seus dados residem e eles mostram a direção em que os dados podem fluir. Primeiro, vamos nos aprofundar na visibilidade para verificar o escopo. Então, por exemplo, se falamos sobre visibilidade, precisamos considerar um método de classe e visibilidade variável ou pelo menos essas construções. No entanto, existem cinco tipos diferentes de visibilidade. O primeiro é público, o segundo é protegido. O terceiro é interno. Forças protegidas internas, e a quinta é privada. Público é o tipo de visibilidade mais tolerante. O membro definido dessa forma pode ser acessado de qualquer lugar. Os membros protegidos especificados só podem ser alcançados a partir da mesma classe ou de dentro da classe. Os membros internos especificados podem ser alcançados a partir do mesmo projeto. E os membros internos protegidos podem ser alcançados a partir do mesmo projeto ou daquelas classes que herdam da classe, seja de outro projeto. Os membros privados especificados podem ser acessados por outros membros da mesma classe. Por padrão, as estruturas de classes são definidas para esse nível de visibilidade. Isso é o mais restritivo. Então, vamos ver a demonstração. No namespace, teremos a visibilidade da classe pública. E teremos a mensagem pública, que é que estou visível de qualquer lugar. E teremos a mensagem protegida do feixe de cordas apenas do mesmo vidro. E mensagem de string interna somente de dentro do mesmo projeto. E teremos a mensagem privada, chatbot Dao. Então, teremos o vazio público. Mas mensagem arquitetada. Essa mensagem protegida usará o console. Linha direita, mensagem B e linha de gravação de pontos do console. Mas se a mensagem, agora, o que podemos ter é outra aula. Então, classe pública B, que vai herdar da classe de visibilidade. E a estática pública. Vazio. Main vai fazer isso. Então, visibilidade, uma nova visibilidade. E uma visibilidade B será uma visibilidade. Espera aí. O que gostaríamos de fazer é ir em frente e usar os telefones ou escrever uma mensagem em linha. Um ou um ponto. Escreva uma mensagem de linha no console dot write line aid at p0 message. E seja Goodall, fez Mensagem. Em seguida, os cones são lidos. Então, agora isso pode ser excluído. Devemos ter a linha certa e teremos a mensagem P. Temos a visibilidade dos olhos, e temos o vazio estático público, principal. Essa será a nova visibilidade da IA. Temos a visibilidade V. E o eu é a visibilidade é nova Eu visibilidade visibilidade para ser como nova visibilidade. E se executarmos isso, devemos ter a seguinte saída. Então isso demonstra a visibilidade. Quando estamos falando sobre escopos. Esse conceito define uma parte do aplicativo em que a variável é acessível e é chamada de escopo de uma variável. Ou as variáveis podem ser definidas em classes, métodos e loops. Então, por exemplo, se temos uma variável de nível de classe cast definida, ela se parece com isso. Então, classe pública A. E podemos ter o evento a, que é seis. E quando declaramos uma variável na classe fora de qualquer método, ela pode ser acessada em qualquer lugar da classe. No nosso caso, assim como a variável a. Quando definimos uma variável dessa forma, elas são chamadas de campos de classe ou membros de classe. Portanto, também podemos falar sobre a visibilidade no nível do método. E podemos definir, por exemplo, vazio. Primeiro. Esse será o nosso método. E teremos um C duplo, que será dez, isso é 0. E poderíamos ter a linha correta do console C. Dessa forma, demonstramos como os métodos encapsulam o nosso próprio namespace e as variáveis definidas dentro dele. Podemos ver como o valor da variável deve ser impresso. E também podemos criar variáveis de nível de bloco. E essas variáveis definidas em um bloco vão viver apenas ou ficar acessíveis enquanto estivermos na execução do bloco. Então isso era tudo que eu queria mostrar a vocês sobre escopo e visibilidade. Vejo você na próxima. 6. C # Avançado inseguro: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre insegurança em C-Sharp. Então, basicamente, estamos falando sobre código inseguro em C Sharp. Quando codificamos o código, executamos o código sem supervisão do CLR, que é curto para o tempo de execução da linguagem comum. Portanto, código inseguro é um código que pode incluir ponteiros. Portanto, você pode tirar uma conclusão de que os ponteiros não são seguros em Dó sustenido. No entanto, não é inteiramente verdade e estamos aqui para lançar alguma luz sobre esse mistério. Portanto, o CLR controla a execução de programas desde o carregamento até a memória até a segurança do tipo de tratamento de exceções. Existem inúmeras instalações fornecidas pelo CLR e há duas instalações que são fornecidas. O primeiro é o coletor de lixo, que deve limpar depois de objetos não utilizados. E o segundo é o gerenciamento de threads. Portanto, existem dois componentes principais do framework.net. Temos o laboratório base, BCL, que é a biblioteca de classes base, e o CLR, que é o tempo de execução da linguagem comum. Portanto, a BCL nada mais é do que a biblioteca dotnet padrão, que pode ser acessada por meio de aplicativos de console, aplicativos VPN, ASP.net e assim por diante. É um conjunto de classes e funcionalidades predefinidas que você pode reutilizar. Então, basicamente, eu posso ser dividido em mais duas partes, o CTS, o CTS e o CLS. O CTS é a especificação de tipo comum e o CLS é a especificação de linguagem comum. Precisamos esclarecer mais dois conceitos que são necessários para entender a execução do código de resposta e o que isso significa. Então, dois tipos de código que é código gerenciado e código não gerenciado. O código gerenciado é considerado um código seguro. O código não gerenciado não é seguro. Então, basicamente, o código gerenciado é executado inteiramente sob a supervisão do CLR. Ele é rastreado e o lixo é coletado automaticamente. Ele também tem acesso a todo o arsenal de instalações fornecidas pela CLR. Agora, aqui vem as dicas. Portanto, os ponteiros são interpretados apenas no contexto, contexto de código não salvo ou inseguro ou não gerenciado. E um ponteiro pode ser um tipo de ponteiro, um tipo de valor, tipo de referência. Então, para definir um ponteiro, precisamos do seguinte código. Podemos ter uma estrela int, que será chamada de ponteiro int. E podemos ter uma estrela vazia, meu ponteiro vazio. E o nome do tipo definido antes do asterix é chamado de tipo de referência. Os tipos de ponteiro não herdam da classe base object place e não há conversão entre os tipos de ponteiro e a classe de objeto base. Também podemos definir vários ponteiros. Então int, estrela por dano, minha saúde, minha experiência, etc O coletor de lixo não protege as referências do objeto. Isso significa que, mesmo que o ponteiro para uma referência ou uma estrutura que contenha referências, o coletor de lixo pode coletá-la ou coletá-la. Portanto, se proibido, é proibido que um ponteiro aponte para uma referência ou uma estrutura que contenha uma referência. E podemos ter ponteiro dos tipos de base em C sharps. Então, vamos demonstrar isso. Vou comentar isso. Então aqui temos array, que vai conter dois inteiros, que serão 12. E podemos usar a estrela fixa int p igual a 0. Aqui, o que gostaríamos de fazer é ter P2, que é igual a p. e usar o console, o console, direita, linha, estrela V2 ou asterix P2. Então, para nos livrarmos do vermelho abaixo da linha, podemos dizer que isso não é seguro. E basicamente depois disso, vamos ver a prova. Tudo bem. Vamos usar o console. Existem três chaves para ler o valor. Então, agora, como você pode ver, temos um ponteiro que aponta para o primeiro elemento da matriz, que é um. E a palavra-chave answer if marca a seção do código que, para o compilador, conterá ponteiros. A palavra-chave fixa significa que fixamos o asterix, seremos muito capazes. Portanto, este no topo da nossa pilha e o último asterix ser mais igual a um é chamado de deferência. Eles estão se referindo. Então, basicamente, se formos em frente e fizermos algo assim, então asterix p mais é igual a um. Então podemos usar o console dot write line asterix be. Então, agora, se você executá-lo, você pode ver que movemos nosso ponteiro com um índice. Portanto, há uma lista de operadores e declarações que podemos usar para manipular ponteiros na resposta do contexto. Assim, podemos ter basicamente o acesso de membro. Podemos ter a indexação, podemos ter o endereço de uma variável, poderíamos ter os operadores aritméticos, e podemos ter operadores de comparação e assim por diante. Portanto, também podemos ter algumas declarações que são fixas e a pilha é log , então travada e bloqueada significa alocar memorial na pilha. E se você quiser verificar a resposta se propriedades de revestimento, podemos ter métodos, tipos e blocos de código, que podem ser definidos como seguros, pois o código é necessário para funções nativas que dependem de ponteiros e Como código, o introduz riscos de segurança e estabilidade do código que contém nossos sub-blocos precisam ser compilados com inseguro que o que corrigimos aqui. E, em alguns casos, como se Deus pudesse resultar em melhor desempenho, uma vez que as verificações dos limites da matriz são removidas. Então isso era tudo que eu queria mostrar a você sobre inseguro. Vejo você na próxima. 7. C# Coleções Genéricos Avançadas: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre coleções genéricas para que possamos ligar. Então, essas linguagens de programação surgiram. Geralmente havia um requisito comum entre eles e as pessoas queriam armazenar dados de forma estruturada para, mais tarde, recuperá-los e manipulá-los. eram operações genéricas que normalmente executadas nesses conjuntos de dados, como ímpar, remover, localizar, classificar, substituir cópia, clonar, número de elementos armazenados e assim por diante. C-sharp e dotnet não são exceção nessa situação. Portanto, existem basicamente dois tipos de coleções que são fornecidas com uma estrutura à nossa disposição. O primeiro é janeiro, e o outro não é genérico, mas eu tive que dotnet versão dois, existem apenas coleções. E se você quiser categorizar coleções não genéricas, podemos falar sobre ArrayList, tabela de hash, lista classificada, pilha, fila e as Coleções genéricas, pelo menos o dicionário é classificado, lista, pilha e fila. Portanto, a principal diferença entre coleções genéticas e não genéticas é o valor dos tipos que elas podem armazenar na coleção não genérica. Cada elemento pode representar o valor de um tipo diferente. Enquanto o genérico significa que você pode ter apenas o mesmo tipo. Então, basicamente, precisamos do sistema de que as coleções são genéricas para usá-lo. E isso nos permite criar, por exemplo, uma lista de inteiros chamada minha lista. E basicamente queremos uma nova lista com, por exemplo, dez valores. Isso significa que temos uma lista que só pode armazenar números inteiros. Ele é chamado de mylist e executou valores meio para baixo sem a instrução using, poderíamos especificá-lo da seguinte maneira. Então, basicamente, poderíamos dar o caminho completo. Isso é só para ser interessante. Para seu interesse. O que também podemos fazer é verificar a tabela hash não genérica. Uma tabela de hash. Deveríamos chamá-lo de meu haxixe. E isso vai ter um novo hash, a barra ou melhor, o conjunto de hash. Conjunto de hash e mostra possíveis correções para eles. Então, sistema que convoca eleições, esse genérico, esse conjunto de hash. Tudo bem, então teremos o HashSet. E isso deve ser como um número inteiro ou algo parecido. E temos a ver com os valores n, não. Janeiro na capacidade. Ou deveria ser HashSet D. Mas deve ser C sharp, hash hash table. Então, vamos fazer isso com a tabela hash. Então, vamos aceitar isso. Oh, isso deve ser uma chamada de sistema de ações que hash the bow, meu hash. E agora podemos continuar. Então, basicamente, vamos chamar esse novo sistema chamado eleições. A bola. Ótimo. Então, o que podemos fazer é o seguinte, meu hash. E teremos a participação da habilidade com o valor primeiro. E meu hash naquele site Ed Lu. E isso deve ser chamado de segundo. Agora, ótimo. Então, o que podemos fazer aqui é o seguinte. Então, para cada 13 D no meu hash. E eu acho que isso também virá das coleções do sistema que entram no dicionário. Ótimo. O que também podemos fazer é simplesmente terceirizá-lo aqui usando o sistema que coleta. E agora podemos removê-lo. Ótimo. Então, gostaríamos de iterar sobre isso e usar a linha certa do console. E teríamos a tecla D igual a esse valor. E use o console para ler a chave. Para aceitar esse valor, vamos executá-lo. E se você executá-lo, veremos o seguinte resultado. Então é assim que podemos usar a tabela hash. O que também podemos fazer é ter uma ArrayList genérica. Então, basicamente, vamos criar uma lista de matrizes. Minha lista também é igual a nova lista de matrizes. E não daríamos um argumento nesse caso. E usar a minha lista para adicionar uma milha é adicionar à minha lista três lineares e assim por diante. Então, apenas por uma questão de demonstração, e para cada objeto guerra por elemento na minha lista, dois, nós seguiríamos em frente e consolaríamos o elemento de linha de gravação de pontos. Ótimo. Agora, o que podemos fazer é ver a saída na tela após a execução. E basicamente é isso. Portanto, há também outro conceito chamado boxe e unboxing. E esse conceito é muito importante quando estamos trabalhando com genéricos em C Sharp. Em geral, o conceito e sua realização fornecem alguns benefícios das coleções de tipos fortes, além de fornecer código de maior qualidade e desempenho aprimorado. Existem duas categorias principais para o tipo de dados é C sustenido. Um é chamado de tipo de valor e o outro é chamado de tipo de referência. O boxe é o processo de converter um tipo de valor em um tipo de referência. E nos bastidores, o CLR aloca um novo objeto no heap e, em seguida, copia o valor do valor dos tipos de valor para essa instância. Por exemplo, temos um inteiro que é a b com o valor 99, um objeto B, que é igual a a. E vamos mudar desta forma. E nós temos a, C com o inteiro b. E agora o que podemos fazer é usar a linha direita do console, veja, mais b, mais a. E lá vamos nós. Portanto, não há espaço entre o espaço que não seja enganoso. E aqui vamos nós. Então, tecnicamente, isso era tudo que eu queria mostrar. Você. Vejo você na próxima. 8. C # Advanced Explicit vs Conversões Implícitas: Olá e bem-vindo de volta. Neste vídeo, continuaremos nossa jornada em Dó sustenido. E vamos falar sobre conversão de tipo explícita e implícita. Então, basicamente, existem duas categorias principais de linguagens de programação. O primeiro é tabulação estática e o segundo é digitado dinamicamente. Então digitou estaticamente estes como C-Sharp, C, C mais, mais e assim por diante. E digitado dinamicamente é como Python e Ruby e outros enfeites. E a digitação dinâmica às vezes também é chamada de digitação de pato. Então, basicamente, se parece com um pato, anda como um pato e grasna como um pato. Então provavelmente é um pato. Vamos dar uma olhada nos recursos fornecidos pelo C-sharp em relação à digitação estática em C-Sharp, quando uma variável é declarada, ela não pode ser declarada novamente ou atribuída um valor de outro tipo. Tipo. O tipo é implicitamente conversível para um determinado tipo de variável. Isso é decidido durante o tipo de compilação e impõe uma restrição sobre como um desenvolvedor usaria variáveis de declaração, embora também venha com um aumento de velocidade na execução. Portanto, linguagens digitadas estaticamente geralmente são mais rápidas do que as digitadas dinamicamente, mas ambas têm suas vantagens e essas vantagens. Então, por exemplo, se dissermos que temos um inteiro que é j em C-Sharp, então não podemos fazer o seguinte. Atribua string como um valor. Isso simplesmente não vai dar certo. Mas o que podemos fazer é atribuir um valor de dez ou fazer o seguinte que 0. Isso deveria funcionar. E isso nos daria um anúncio ou porque o inteiro e uma string ou não implicitamente conversíveis, pode chegar um momento em que precisaremos copiar um valor de outro valor aqui, valor de um variável para outra variável, como passar inteiro para um método que usa argumentos longos duplos ou permanece um para empurrar variáveis entre classes. Portanto, o C sustenido fornece maneiras de converter um tipo em outro. Um é implícito, o outro é explícito. O terceiro é definido pelo usuário e o quarto é a conversão com classes wrapper. Portanto, a conversão de tipo também é chamada de fundição ou tipografia. Conversões implícitas. O que devemos saber sobre eles? Basicamente, quando falamos sobre conversão implícita, essa não é uma sintaxe especial para essa conversão de tipo. Esse é o tipo mais seguro de fundição. Nenhum dado é perdido. Por exemplo, converter de tipos inteiros menores para maiores ou classes em classes base. Essa é uma tabela de conversão numérica implícita, que é útil quando queremos descobrir quais números inteiros são compatíveis. E você pode encontrá-lo aqui no lado da Microsoft. E, por exemplo, para uma conversão implícita, poderíamos usar o seguinte. Vamos esconder isso. Portanto, temos um número inteiro que é chamado de número 128, e teríamos um duplo, que é maior e é igual ao número. E a amplitude é um exemplo de conversão implícita de classe para classe base seria algo assim. A classe a é igual à nova classe. E teríamos a classe base C, que é igual a a. Isso é apenas um exemplo porque eles não estão bem definidos, mas é assim que você pode e deve fazer isso. E há uma série de conversões, subtipos que são considerados implícitos. Por exemplo, conversões de identidade, conversões numéricas implícitas e assim por diante. Agora que temos a conversão implícita fora do caminho, devemos falar sobre X mais versões calmas. Portanto, esse tipo de fundição também envolve um operador de custo. E o processo geralmente está associado à perda de informações ou falha na conversão entre conversões normalmente não métricas. Mencionei quando convertemos de um tipo de dados de precisão maior para uma precisão menor e às vezes, a conversão de uma classe base para uma classe de banco de dados é mostrada também aqui. Então, um exemplo para uma conversão explícita seria meu pi. E diríamos que temos um inteiro a e gostaríamos de ter o valor como um inteiro da minha torta associada a a. E se fôssemos usar a linha direita do console com a e meu b, obteríamos a seguinte chave de ganância de Guanzhong. Vamos salvá-lo e executá-lo. Assim, podemos ver que o decimal, os números após o ponto de corte. Nesse caso, podemos falar sobre conversões executadas entre classes. Então, temos, por exemplo, uma classe OPA, que é o carro. E isso seria um exemplo da classe alta. E teremos um carro C, que será igual a o. E teríamos a OPA o igual a c. Então este é um exemplo conversão explícita entre classe e classe base. E basicamente é isso. O que eu queria te mostrar. Vejo você na próxima. 9. Funções com expressões avançadas C #: Olá e bem-vindo de volta. Agora, o que gostaríamos de aprender em c-sharp é o tópico, a expressão, mas funciona com sintaxe. Mas funk, synth Don't Save. OK. Assim, com a versão da versão seis da linguagem C Sharp, esse recurso foi adicionado à linguagem de programação. É chamado de membros do corpo de expressão. A ideia por trás desse recurso era tornar o código mais legível e conciso. E vamos ver neste vídeo como esse novo recurso pode ser incorporado ao nosso código. Portanto, temos o conceito de membros em C-Sharp, e está relacionado à programação orientada a objetos. Os números nos permitem modificar o comportamento de nossa classe e mudar a forma como ela interage com outras classes e permitir que ela e informações encapsuladas conforme necessário. Portanto, os membros são a cola que mantém a aplicação unida. Então, quais são os membros que estão disponíveis? Temos construtores, destruidores, getters e setters de propriedades, métodos e indexadores. A expressão but in members pode ser aplicada a qualquer um dos itens acima mencionados, mas precisamos considerar qual deles está disponível em nossa versão atual. Portanto, versões suportadas da versão seis, o getter de propriedades e métodos. A partir da versão sete, o construtor, setor de propriedade do destruidor e os indexadores. Então, vamos dar um exemplo para o construtor e o destruidor. Então, basicamente, teremos um servidor de classe. Dentro de nossa classe, teremos o nome da string pública e o nome da string do servidor público é igual a nome , igual a nome. E precisamos ter certeza de que esta é a maiúscula M e esta é a capital N. Tudo bem, agora, poderíamos ter nosso destruidor para o servidor. E poderíamos simplesmente dizer na linha certa do console que o fim está próximo. Tudo bem. Agora, o que teríamos aqui, vamos chamar isso de amigo const de classe pública. E teríamos nosso público estático, vazio principal. E teríamos o servidor, que é um do novo servidor. Então aqui, ou melhor, controlador de domínio. E depois disso, o que poderíamos fazer é usar o ponto do console, escrever um nome de linha e usar a chave do console. Aguarde o aviso. Agora, se o executarmos, podemos ver o seguinte ODE. E sim, basicamente é isso. Então, é assim que podemos usar nos membros. O que também podemos fazer é usá-lo basicamente em acessadores. Então, por exemplo, se meu servidor deve ter um público na CPU V, então poderíamos ter o retorno get da CPU v Scott v, e o setor retornar o sublinhado V CPU igual ao valor. E sim, teríamos também a CPU privada int underscore V. Então é assim que podemos aplicá-lo basicamente à fonte de acesso. Então, poderíamos seguir em frente e usar uma vCPU para ser igual a dez. E poderíamos adicioná-lo à nossa produção. Se o executarmos, podemos ver que esse servidor tem dez núcleos. E também poderíamos ter um indexador usado. Então, tecnicamente, se definirmos a string pública e chamarmos essa rede, então isso pode ser uma nova string com cinco valores. E poderíamos usar a string pública. E esse int eu recebo adaptadores de rede. E adaptadores de rede são iguais a valor. E aí temos os adaptadores de rede com essa string. E nós deveríamos ter esse I. E este com o índice. É assim que o usaríamos em indexadores e também poderíamos usá-lo em métodos. Então, basicamente, se definirmos nosso vazio público, poderíamos ter a linha certa do console inicializando. E depois diga que o estado é igual a Iniciado. E para que isso funcione, precisamos definir o estado privado da String do pub. E é mais ou menos isso. Então, isso é tudo que eu queria dizer sobre a expressão, mas ela funciona. Portanto, essa é uma maneira mais nova e concisa usar suas aulas com todas as guloseimas. Vejo você na próxima. 10. C# precedência avançada do operador: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre a precedência do operador em C-Sharp. Então, vamos criar um novo projeto para isso. Então, basicamente, a ordem dos termos e da expressão em qualquer linguagem de programação é determinada pelo resultado da avaliação. E a precedência do operador em C-Sharp determina como o agrupamento desses termos e expressões acontece. E abordaremos o essencial sobre o que você deve conhecer dessa técnica e criar aplicativos semanticamente corretos. Portanto, existem três tipos diferentes de operadores que são operadores unários, binários e ternários. E isso define quantos operandos e operadores podem levar. O United pega um, o binário leva dois e o curtume leva três operandos. Precisamos falar sobre associatividade. Então, basicamente, existem dois tipos de associatividade: um é da esquerda para a direita e da direita para a esquerda. E a precedência do operador é significativa somente se houver operadores de precedência maior e menor em uma expressão. Nesse caso, a precedência é da esquerda para a direita. Então, por exemplo, int x é igual a sete mais três dividido por dois. A ordem que precisamos lembrar é que, quando falamos em urina, temos essa força seguinte. Então temos o tamanho do final, a estrela. Os prefixos mais, menos , negação, mais, , negação, mais, mais e menos menos. E então temos o elenco de tipos. Quando falamos sobre expressões condicionais, temos o ponto de interrogação e a coluna. E temos atribuições compostas simples, Like igual vezes igual dividido por igual, e assim por diante. E podemos basicamente mudar a precedência dos operadores por parênteses é, e é isso que quero dizer com isso. No primeiro caso, primeiro dividiremos três por dois e depois adicionaremos sete. No segundo caso, somaríamos 37 e depois dividiríamos por dois. Então isso era tudo que eu queria mostrar. Você. Vejo você na próxima. 11. Pontos de entrada e saída do método avançado C #: Bem-vindo. Neste vídeo, falaremos sobre métodos, pontos de entrada e saída. Então, cada aplicação C, C-Sharp tem um antropólogo chamado método principal. Esse método é invocado primeiro e qualquer lógica de negócios implementada em seu AP é controlada. A partir daqui. Neste guia, vamos descobrir como o CRM CLR, para que o tempo de execução de linguagem comum saiba qual método chamar e quando chamar. E vamos ver a diferença nesses contextos entre os aplicativos executáveis e as bibliotecas. Portanto, o CLR é o tempo de execução da linguagem comum. objetivo é traduzir seu código para que o hardware da sua máquina possa entender suas intenções. Quando você escreve o código em dó sustenido, ele é chamado de código-fonte. O compilador específico da linguagem transformará esse código em algo chamado MSAL ou linguagem intermediária da Microsoft. E às vezes também é chamado de CIR, ou linguagem intermediária comum. E basicamente, o estado intermediário do código também tem metadados específicos de linguagem e tipo e a implementação real de cada uma de nossas classes, funções, métodos, e assim por diante. Agora, o CRM CLR entra em ação e fornece um serviço e o tempo de execução para o seu código residir e o GIT, o compilador de tempo de ajuste também vive nesta RAM, que transforma o código em código de máquina, que, por sua vez, é executado pela CPU em seu computador. O exemplo mais básico é o que você pode ver na tela. Então Ponzo, aquela linha certa, olá mundo. E quando executamos esse código, podemos ver que o Hello World está impresso no console. E depois disso, ele fecha. Então, quando temos um aplicativo que é comparado a um arquivo executável, temos duas abordagens distintas para pontos de entrada. Um é síncrono e o outro é assíncrono. O tipo de função principal é sempre estático. E temos a opção de escolher se queremos retornar o código de status depois que o aplicativo existir ou não. E precisamos usar inteiro, caso contrário, vazio. Então, métodos síncronos são esses. Então, se formos aqui e fizermos isso, tão básico Curly, vamos lá. Temos um main que não retorna nada sem argumentos. Um é com argumentos, e o outro principal está retornando um inteiro sem argumentos e o outro é com argumento. E o outro tipo ficaria assim. Portanto, temos algo chamado tarefa no domínio. E também pode ter versões argumentativas e não argumentativas. Por que é duplicado? Os pontos de saída servem como um mecanismo de controle e eles transferem o controle de volta para o chamador. Com o valor de retorno de um tipo específico ou nulo. O método principal para alcançar os pontos de saída significa que nosso aplicativo está fechado. Então, por exemplo, se dissermos que retornaremos 0, então esse será nosso ponto de saída, por assim dizer, em uma função. E isso é tudo que eu queria te mostrar. Vejo você na próxima. 12. Restrições de parâmetros C# Advanced Genéricos: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre restrições genéricas de parâmetros. Assim, o genérico tornou-se parte do C-sharp com a versão 2 da linguagem e o CLR, o tempo de execução da linguagem comum. Ele introduziu um novo conceito de parâmetros de tipo que permitem projetar classes e métodos que diferem da especificação de uma ou mais guias até que a classe ou método seja declarado e instanciado pelo código do cliente. Então, por exemplo, se fôssemos criar uma classe, classe genérica array d, e dizer que temos o vazio público. Resuma a entrada. E é assim que você pode definir uma classe genérica. E, basicamente, essas classes e métodos combinaram três recursos distintos. Uma é a reutilização, a segunda é a segurança do tipo e a terceira é a eficiência. Os genéricos são mais frequentemente usados em conjunto com coleções e métodos que operam neles. Um novo namespace foi introduzido, que é chamado de system that collections, que genérico, que contém várias novas classes de coleção baseadas em genéricos. Também temos a possibilidade de criar tipos genéricos personalizados. Então, precisamos falar sobre parâmetros também. Portanto, chamamos o parâmetro de espaço reservado para um tipo específico que o cliente especifica quando cria uma instância de um tipo genérico. Uma classe genérica não pode ser usada como está, porque é simplesmente um blueprint para esse tipo e precisamos declarar, em seguida, instanciar um tipo construído por tipo específico de volume. E podemos ter um exemplo para isso. Então, por exemplo, se tivermos esse array genérico, que é um número inteiro, então é assim que nós o instanciaríamos. E vamos ver as possíveis soluções. Nós não temos um. Tudo bem? Então, neste exemplo, mostramos a instanciação de instanciação para o blueprint de array genérico com tipos inteiros. E, nesse caso, o parâmetro t é substituído em tempo de execução. E com o argumento type que nos permite criar um tipo de objetos seguros e eficientes usando uma definição de classe. Existem algumas regras sobre nomenclatura, portanto, os parâmetros de tipo genérico devem ter nomes descritivos e prefixo parâmetro de tipo descritivo T, ou algo parecido. Também temos oito restrições das quais precisamos estar cientes. Então, deixe-me copiar e colar aqui. Então, quando d é um strike, o argumento deve ser um tipo de valor, exceto agora a bola, quando é classe, o argumento deve ser um tipo de referência e se aplica a classes quando t não é. Agora, o argumento deve ser não, não liberal. Quando não é gerenciado, o argumento deve ser um M e cada tipo, é uma classe base. O argumento deve ser tratado a partir de uma classe base. Quando d é uma nova instância, o argumento deve ter um medidor pai menos construtor. Quando é uma interface, o argumento deles já deve estar implementado em uma interface específica. E quando for você, o argumento deve ser ou papai com o argumento fornecido para você. Então, por que usamos restrições? imposição de restrições ou parâmetros de tipo específicos nos permite aumentar o número de operações permitidas e chamadas de método para aqueles suportados. E o que gostaríamos de fazer é criar uma demonstração para o exame. Deixe-me comentar isso. Digamos que temos uma classe, classe genérica com t, onde t é uma classe. E podemos dizer que temos um t privado somente leitura, que é um campo. E temos uma classe genérica pública, o campo ou melhor, o valor. E esse campo sublinhado é igual ao valor. Também temos o método genérico público t com o medidor inferior T. E podemos seguir em frente e usar a linha certa do console. E diga que o tipo do medidor inferior é T e valor é valor. Ou melhor, medidor ou medidor inferior. Tudo bem? E o método genérico. E as mulheres precisam ter certeza de que devolvemos esse campo. E podemos usar a linha certa do console. A impressão de que o tipo de retorno do parâmetro é dipolo. Valor T. Este campo de pontuação. Tudo bem, aqui podemos instanciar nossa turma. Assim, podemos ter uma string de classe genérica a, que é igual à nova string de classe genérica hello world. E podemos usar a chamada de método genérico a dot. E podemos usar a linha de gravação de pontos do console, não a linha direita, a tecla de leitura para pausar por um segundo. E vamos dar a isso a sequência de argumentos. Tudo bem, vamos executá-lo. E como você pode ver, temos uma string com a string de valor. E lá vamos nós. Então, essas são as mensagens que podemos ver. Tecnicamente, isso era tudo que eu queria te mostrar. Vejo você na próxima. 13. C # Avançado Abrir e Fechado tipos genéricos: Bem-vindo. Neste vídeo, falaremos sobre os tipos genéricos de abertura e fechamento. Assim, com a versão dois de C Sharp, um novo conceito foi incluído, é introduzido, que é chamado de genética. A ideia básica era permitir que tipos específicos como float, double ou string fossem passados como um parâmetro para métodos, classes e até interfaces. Essa é uma limitação muito crucial para as coleções, que é a falta ou mesmo a ausência de verificação de tipo. No entanto, isso permite que você adicione os objetos de qualquer tipo de interconexão porque eles são todos descendentes da classe base do objeto. Isso contradiz a definição básica de C, C-sharp como sendo um tipo seguro e compreende a segurança do tipo. Neste guia, vamos dar uma olhada mais profunda sobre o que são genéricos e o que eles propriedade aberta e fechada significa. Os tipos em C Sharp têm duas categorias principais. Um é chamado de valor e o outro é chamado de tipos de referência. Ambos podem ser tipos genéricos que usam parâmetros de tipo individual. Então, o mês de janeiro fechado. Portanto, um dos recursos mais poderosos e C-sharp, que faz com que os desenvolvedores definam tipos de estruturas de dados, como coleções. E isto é, isso não resulta apenas em melhor qualidade de código, mas nos bastidores, ele adiciona um aumento de desempenho decente também. Então, vamos ver como isso parece. Teremos um dispositivo de classe pública. E esse dispositivo terá um nome público d0, Get and Set. E a categoria pública T. Com o gatt e o conjunto. Faremos com que o público aguente. Isso vai aqui. Então, esses serão os genéricos da classe pública. E o que gostaríamos de fazer é ter o público estático, vazio principal. E dentro do principal, teríamos o dispositivo com a string a como um novo controlador de domínio de dispositivo. E vamos pular o nome. Tudo bem, sim, devemos fazer isso? E temos o dispositivo float b com o novo dispositivo float. E vamos apenas fechá-lo. E podemos modificar o a, esse nome para ser o controlador de domínio. E a categoria a para ser essa coisa. E isso vale para o B também. O servidor DNS estará nessa categoria. E vamos chamá-lo de produção. E o que podemos fazer é, por exemplo, esperar. Isso deve ser 1 f e 2 f. Então console, direita, linha, a, nome e uma categoria. E o mesmo vale para o B, O, K e use o cólon. Então, leia a tecla para manter o console. Por que damos uma olhada nisso? Lá vamos nós. Criamos uma classe genérica que representa um dispositivo. E com base no tipo do genérico, podemos inicializar os valores. E o que também podemos fazer é criar um janeiro aberto. Então, gostaríamos que esse código demonstrasse isso. Então, teremos uma aula pública, o g com o T. E precisamos usar a reflexão do pensamento do sistema. E aqui teremos o público em M, g. E teremos um woo hoo igual a 0. Para usá-lo, o que precisamos fazer é criar uma instância. Então, teremos um vazio estático público. Espera aí. Isso está na genética vegetal é pública. Objeto estático. Será executado? E isso vai ter o tipo de enum g para isso. Pegue o campo vermelho mais frio. Woo hoo. E gostaríamos de obter o valor. E agora o que podemos fazer é seguir em frente e criar um novo objeto de instância que será executado. E teremos a linha certa do console. Conte-nos o seguinte. Isso é genérico? E usamos o foo que digita informações de tipo e é uma definição de tipo genérica. Agora, é assim que você pode definir os genéricos abertos. E usando a reflexão para obter um campo constante, o Woo-hoo. O CLR converte automaticamente o inteiro em uma instância do tipo aberto. Então, basicamente, foi isso. O que eu queria mostrar neste vídeo. Vejo você no axônio. 14. Parâmetros e descarte avançados do C #: Olá e bem-vindo de volta. Neste vídeo, vamos dar uma olhada em dois recursos incluídos na versão sete em Dó sustenido. E esses recursos mudaram essencialmente a forma como os desenvolvedores trabalhavam e os aplicativos eram desenvolvidos. O parâmetro app é útil quando os métodos precisam retornar mais de um valor. E esse parâmetro é passado por referência e basicamente transforma o parâmetro formal, um alias para o argumento que deve ser muito capaz, muito semelhante à palavra-chave reference. Mas a principal diferença é que o último precisa ser inicializado antes da mão. A variável descarta basicamente temporária, portanto, variáveis fictícias que são usadas no código do aplicativo. objetivo principal deste gato é fornecer variáveis reutilizáveis que diminuem a alocação de memória e melhoram a legibilidade e a capacidade de manutenção. Primeiro, vamos dar uma olhada no parâmetro OUT. Então, basicamente, tem três regras. O parâmetro pode ser passado sem declaração e inicialização. Ele pode usar o tipo var na lista de parâmetros do método. Não precisamos ter o mesmo nome para nosso parâmetro na função e no núcleo. Então, vamos fazer uma demonstração para isso. Temos uma string estática pública, SLA. Com o duplo a e o duplo B. Dentro desta função, gostaríamos de ter um resultado que vem da matemática em torno de a vezes b. Ou melhor, como devemos fazer isso? B dividido por a. E gostaríamos multiplicá-lo por 100 e precisamos de dois dígitos. Então é isso que gostaríamos de ter. E teremos a string SLA igual ao total de horas disponíveis. Horas. E o SLA é o resultado. Agora, o que gostaríamos de fazer é devolver o SLA. E o que gostaríamos de fazer depois disso é basicamente modificar nossa assinatura de função. E diríamos que nosso resultado duplo saída e SLA de string de saída serão outros parâmetros. E temos que remover a inicialização disso. Podemos usar essa função chamada a partir de agora. Então console a linha certa. E gostaríamos de usar o que usaríamos SLA. E, basicamente, gostaríamos de ter o total de horas disponíveis com oito. E gostaríamos ter o resultado do romance e sair. String SLA e usar os telefones são fundamentais. Para salvá-lo. Tudo bem, vamos começar. E como você pode ver, esse é o resultado. O que também podemos fazer é usar esse cartão. As variáveis deste cartão têm o símbolo de sublinhado. Então, por exemplo, se criarmos uma variável que é chamada Coupa com 12345, então vá em frente e faça o sublinhado. , sublinhado Sublinhado, sublinhado é igual a cupom. Então, o que podemos fazer é usar a linha certa do console, escrever o primeiro e o segundo. Então, deixe-me mostrar a você. Então isso é basicamente o simples, este é um exemplo simples para o descarte e como usá-lo. E nossa tarefa era criar duas variáveis das quais foram nomeadas variáveis do cupom e descartar o restante dos valores. E se pudermos dizer algo assim, o verdadeiro poder dessa carta é quando a combinamos com a variável externa. Então, por exemplo, se tivermos public void, sorry, static, void B, S com a string d t. Então se o tempo que seca barrar o SDR e sair sublinhado, então poderíamos dizer que os cones à direita a data da linha é válida. De outra forma, a data da linha direita do console está em Guanzhong. Esquerda. Tudo bem. Não vamos esquecer esse aqui. E se pudermos ir em frente e ligar para o PS com o O2, 292022. Devemos ver o seguinte em nossa tela. E aqui vamos nós. Então, tecnicamente, isso é tudo que eu queria mostrar a vocês neste vídeo. Vejo você na próxima. 15. Diretivas avançadas de pré-processador C #: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre diretivas de pré-processador em C-Sharp. Então, basicamente, esse conceito pertence ao reino das linguagens compiladas. São linguagens compiladas ou linguagem que leva algum código de nível superior como C-Sharp ou C. E com a ajuda do compilador, ele o traduz para código de máquina. O compilador é uma camada de abstração entre diferentes arquiteturas de fabricantes. Ele sabe como traduzir blocos de código para arquiteturas diferentes. Então, sim, processadores Intel ou AMD. E o processador em si não garante o código final da máquina. Como o próprio nome sugere, ele está apenas pré-processando as instruções. Temos um idioma de nível superior. Então temos um pré-processador do que uma linguagem pura de alto nível, do que um compilador e montador, carregador e vinculador. Portanto, as diretivas de pré-processador podem ser a instrução if como uma folha e if e assim por diante. E vamos dar uma olhada em um exemplo simples. Por exemplo, se quisermos usar essa diretiva, poderíamos dizer que, se depurar, gostaríamos de dizer que o console do sistema, modo de depuração da linha direita. Gostaríamos de dizer ponto do console do sistema, escrever linha e conhecer o bug. E depois traga aqui. E podemos fechar isso com a declaração endif. E aqui definimos uma diretiva de pré-processador que diz que isso só deve ser considerado no modo de depuração. Caso contrário, não imprimimos nenhuma depuração. E podemos executar essa solução no modo de lançamento ou depuração. E, por padrão, o modo de depuração é R1, e essa é a saída que devemos ver. Então, vamos em frente e usar as chamadas do sistema ou a tecla de leitura. Se executarmos a solução, você pode ver que estamos executando no modo de depuração. E sim, essa foi a demonstração. Então, definimos um indefinido. E essas diretivas podem ser usadas para definir ou definir diretivas para o pré-processador. E o caso de uso mais comum para isso é quando gostaríamos definir condições extras para a compilação em si. Portanto, isso geralmente é feito em conjunto com a diretiva def. E, basicamente, poderíamos ir em frente e definir o desenvolvedor. E se for fraude, gostaríamos de dizer que definimos debug e undefined, brace and end if. E devemos colocá-lo no primeiro. Isso está funcionando. Então, o que também podemos fazer é usar o aviso ou o anúncio ou, basicamente, poderíamos dizer que se não corroer, não testar e não Deb, podemos lançar uma mensagem de erro informando que não combinar. Omitimos uma mensagem de aviso informando que está sendo executado com código fixo. E podemos acabar com essa declaração if. E se executarmos essa solução, não veremos nada. Mas no minuto em que removo este, vemos que há adultos na compilação e podemos ver a mensagem de erro que não podemos compilar. Portanto, esse é um comportamento que podemos implementar. O que podemos fazer é usar também a directiva align. Então, a linha que ativa nos permite modificar a numeração do slide do compilador e até mesmo o nome do arquivo para os adultos e avisos. Então, digamos que gostaríamos de modificar o nome do arquivo relatado quando um aviso é gerado. Então vamos colocar aqui e dizer essa linha, um, querendo linha que C S. Agora, se removermos isso, devemos ser capazes de executar nossa solução. Nós temos essa saída. Tudo bem? Agora, o que gostaríamos de fazer é aprender sobre região e região n. Portanto, essas diretivas são úteis quando estamos trabalhando com editor do Visual Studio Code ou com o próprio estúdio. E não há saída especial dessa dieta ativa, mas permite que você marque regiões específicas que serão expansíveis e colapsarão, colapsarão a CBO pelo editor de sua escolha. Então, por exemplo, poderíamos dizer que uma região usando e poderíamos dizer que esta é a região final. E agora somos capazes de colapsá-lo. E também temos o pragma, o aviso de pragma e a soma de verificação do pragma. Em palavras simples, diretiva pragma pode ser usada para afetar como os relatórios ou avisos de tempo de compilação são tratados e dar instruções especiais aos compiladores. Portanto, existem duas variantes básicas. Um está querendo, o outro é checksum. Quando usamos querer, temos a opção de especificar desativado ou restaurar, seguido por uma lista de avisos que precisam ser tratados ou nada pressupõe todo tipo de desejo soma de verificação congênita, gera uma soma de verificação do arquivo de origem que terá a depuração. Então, por exemplo, se tivermos o seguinte pragma definido e executá-lo, você verá que não há problemas encontrados. Basicamente, isso era tudo que eu queria mostrar a vocês sobre diretivas de pré-processador. Vejo você na próxima. 16. Índices de Sobrecarga Avançada C #: Bem-vindo. Neste vídeo, falaremos sobre indexadores de sobrecarga em C-Sharp. Portanto, no C-Sharp, temos muitas estruturas de dados diferentes disponíveis. E isso nos permite armazenar e recuperar dados específicos em nosso momento de necessidade. Neste vídeo, vamos aprender sobre indexadores e, especialmente, como você pode sobrecarregá-los fazendo o caminho certo. Quando falamos sobre o indexador sobrecarregar a ideia por trás disso, a força, a classe para se comportar como uma estrutura de dados e acompanhar suas instâncias que nos permitem recuperar essas instâncias à medida que faria com uma matriz, matriz de lista. Primeiro, limpamos o tópico dos indexadores e, em seguida, voltamos nossa visão para adicionar sobrecarga. Então, vamos criar um novo projeto na carga. Então essa é uma sintaxe geral, basicamente de modelo para isso. E vamos dar uma olhada nisso em um exemplo prático. Então, por exemplo, digamos que temos alunos de uma turma. E aqui temos uma matriz de string privada. E vamos chamar isso de indexadores, que é uma nova string com valores de Dan. E temos uma String pública. E isso aponta para o índice. E o que gostaríamos de fazer é o seguinte. Teremos o gatt, que retornará o índice dos indexadores e o conjunto, que definirá o índice para um valor específico. Aqui no geral, o que gostaríamos de fazer é criar uma nova instância dos alunos, e vamos chamar isso de escola primária. E aqui gostaríamos de ter o primeiro elemento da escola primária com meu nome, e o segundo elemento da escola primária com o nome do meu irmão. E o segundo elemento da escola primária recebe o nome da minha irmã. E o que gostaríamos de fazer é pegar um loop for e iterar de 0 a I less than e imprimir a linha correta do console. E a escola primária. É o elemento. Em seguida, use a tecla de leitura do console para manter o prompt. Agora, como você pode ver no console, temos os três nomes. E é claro que está piscando aqui porque o resto da lista está vazio. Agora, o que acontece aqui? Temos um curso de classe, alunos se comportando como uma matriz estranha e permitindo que até dez nomes de alunos sejam armazenados no domínio. A turma é instanciada e três alunos são inseridos. E se fôssemos definir os seguintes elementos, escola primária, TAM, mãe, então deveríamos ter uma exceção. Porque não há um décimo elemento. O tamanho simplesmente não nos permite que sejam pontos importantes aqui. Portanto, existem dois tipos básicos de índices. Uma e duas dimensões. pesquisa de índice pode ser sobrecarregada e elas não são iguais às propriedades e permite que um objeto seja indexado e definido como acessador. Vamos designar. No entanto, recuperaremos um valor. O valor é usado quando você define o valor. E os indexadores são chamados de matrizes inteligentes ou propriedades parametrizadas, o que pode ser um pouco enganador. E os indexadores não podem ser membros estáticos, pois são como membros da classe. Então, como sobrecarregamos os indexadores? Vamos criar uma nova classe. Vamos chamar esses guias. E temos uma string privada, nomes de matriz e guia, que é uma nova string. Valores de Dan. Teremos a string pública, esse índice int esse índice int retornará o valor do índice de nomes de guia. E o conjunto definirá o valor do índice de nomes de guia para o valor especificado. E poderíamos ter o público durante isso com o índice flutuante. E devemos ter as mesmas funções Get e Set. E teremos a string pública, esse id duplo. Vamos modificar este. E teríamos definido como um. E aqui não teríamos uma definição definida. Ambos retornam algo que é chamado, isso é somente leitura. E agora, no nosso principal, se comentarmos isso, podemos instanciar os guias. E teremos um valor duplo, o k, e é**** 0. E aqui o primeiro elemento do guia seria escrito. E o elemento baseado no índice flutuante das guias estaria nas guias. E o que podemos fazer é usar a linha certa do console. E gostaríamos de imprimir o elemento guias k. E gostaríamos de imprimir o primeiro elemento. E gostaríamos de imprimir o primeiro mais o primeiro elemento baseado em flutuador. Tudo bem? Então, o que podemos ver aqui é que acessamos basicamente versões diferentes disso com base no tipo de indexador que usamos. E aqui temos um índice que é um número inteiro. E aqui temos um que é um valor flutuante. E podemos referenciá-los e manipulá-los com base nesse valor de retorno. E temos um exemplo final que gostaríamos de dar uma olhada, e seria chamado chá multidimensional mais que mencionei agora. E aqui teremos a string privada. E nós temos essa vírgula. E temos os nomes dos guias, que é igual a uma nova string dez vezes. Então teríamos a string pública, isso int x e int y. E teríamos o get, que retorna os nomes de guia x e y. E teremos o conjunto que vai definir o guia nomeia x e y para o valor. E se formos em frente e instanciá-lo, então use todos eles. Os diamantes agora são iguais aos novos multidimensionais. E depois use o a primeiro. Haverá o Danio e um para ser outro. Então podemos usar loops aninhados para iterar sobre j igual a 0, j menor que o termo j mais mais. E use a linha certa do console. E gostaríamos de usar a e y ou j. E o que gostaríamos de fazer é adicionar o cheque. Então, se x e y são iguais a null, então usamos os telefones toda essa linha brilhante com a string f. X e y estão vazios. Então, vamos fazer isso x, e vamos fazer isso y. E caso contrário, desculpe, eu e j. E j. Caso contrário, gostaríamos de usar essa impressão. Tudo bem. Então, agora na saída, isso é o que podemos ver. Por que tecnicamente é isso. É assim que você pode sobrecarregar os indexadores em C-Sharp. Vejo você na próxima. 17. Atributos pré-definidos comuns avançados em C #: Olá e bem-vindo de volta. Neste vídeo, vamos dar uma olhada no propósito dos atributos predefinidos comuns em C-Sharp. Assim, os atributos permitem que os desenvolvedores associem metadados ou informações declarativas em seu projeto e seu código. Uma das maneiras que eu prefiro usar são as aulas ou funções de amanhã obsoletas à medida que o desenvolvimento do aplicativo continua? E primeiro vamos dar uma olhada no que são atributos e ver alguns exemplos disso. Portanto, os atributos são lugares em seu código onde podemos defini-los. E eles são como montagens, métodos, tipos e a lista continua. Depois de associar o atributo à nossa parte selecionada do código, temos a opção de consultá-lo com uma técnica chamada reflexão. No framework.net, cada tipo e componentes, como assemblies e classes, têm seus próprios metadados definidos por padrão, que podem ser estendidos por informações de metadados personalizados como nós, nós somos no gol. E quando aplicamos informações de metadados, temos a opção de escolher o escopo. Podemos aplicá-lo a montagens inteiras ou apenas a partes específicas do nosso código. Os atributos têm a capacidade especial de continuar, para serem configurados com parâmetros. E, finalmente, a coisa mais especial sobre metadados é que nosso aplicativo pode inspecionar seus próprios metadados e também inspecionar outros metadados de progresso. Isso nos permite criar a verificação de compatibilidade e outros recursos interessantes. Então, há esse código esqueleto que podemos usar. E isso vai nos dizer que esse é um parâmetro posicional, tem valor e assim por diante. Digamos que temos o seguinte código que representa a máquina de camisola e tem duas funções. Uma é a inicialização da máquina e a outra é a instalação de atualizações. Portanto, temos o servidor de classe pública e ele tem o nome da string privada. E tem o nome da string pública, nome da propriedade. E defina o nome igual ao valor. Desculpe, nome sublinhado. E temos o nome da string pública, nome do construtor. Ele vem para especificar um nome. E temos o servidor público de atualização void, que está indo direto para o console. Esse servidor de atualização. E nós temos o começo. E isso vai dizer que estamos reiniciando o serviço. Ótimo. Então, agora o que gostaríamos de fazer é encerrar nossa aula. Sim. E à medida que o projeto evolui, gostaríamos de adicionar a próxima função que irá descontinuar o servidor de atualização e lidar com a atualização e a instalação e a tarefa de início restante com alguma etapa extra. Então, como deixamos os desenvolvedores saberem que a nova função será introduzida, o que cobre isso. Tudo o que é. O que podemos fazer é adicionar a nova linha, ou melhor, a definição da função. E então diga ao servidor de atualização que isso está obsoleto. E o que gostaríamos fazer é dizer à duna para usar esse método, usar o início. E também podemos ter essas quedas falsas aqui. Então agora temos isso, dessa maneira. Tudo bem? Portanto, o ponto chave aqui é essa linha, e ela precisa ser precisa com os nomes das funções. Caso contrário, o compilador lançará um erro informando que o método ao qual estamos nos referindo não pode ser encontrado. Então, o que gostaríamos de fazer é copiar este e ter certeza de que isso também está correto. E precisa ser preciso para os nomes das funções. Caso contrário, o compilador lançará um anúncio ou declarará que o método ao qual estamos nos referindo não pode ser encontrado. O segundo argumento é verdadeiro ou falso. Quando definimos como false, o compilador emitirá um aviso, mas a compilação que passaremos. Se for definido como true, uma exceção será levantada e a compilação será interrompida. E esse também é um conceito chamado de segmentação por atributos. E aponta para a entidade a qual o atributo é direcionado. Nesse caso, a função a é o alvo. Agora podemos falar sobre atributos predefinidos. Esses atributos se referem a um conjunto de atributos que são incorporados à biblioteca de documentos pela Microsoft. E precisamos estar cientes de que essa é uma classe base para atributos, que é chamada system that attribute. E cada atributo predefinido do cliente é herdado dessa classe base. Os atributos predefinidos mais comuns são serialização, serialização, obsoleto, DLL, importante e método úmido. O que podemos fazer é definir os atributos de nossos clientes. Portanto, qualquer pessoa que use o framework.net e defina seu custo de absolutos, pode ser para uso privado ou privado, é empacotado em biblioteca ou aplicativo público. O que gostaríamos de fazer é seguir em frente e criar a seguinte demonstração. Então temos que importar o sistema dessa reflexão. E o que queremos fazer é definir uma classe. E o uso do atributo dessa classe será o atributo alvo dessa classe. E a classe será chamada de atributo da empresa, que herdará da classe base do atributo. E teremos o nome da string privada, a localização da string privada. E o nome da string pública com a lacuna. Isso retorna o nome. E o conjunto, que vai definir o nome igual ao valor. E teremos a localização pública da string. E teríamos um construtor. Portanto, atributo de empresa pública e a empresa de string e a localização da string. E gostaríamos de ter o nome igual a empresa e a localização igual à localização. Tudo bem? Então, agora que temos isso fora do caminho, podemos ter uma nova classe base de atributos onde a empresa será imaginária. E terá algo localizado em Atlanta. Isso, isso vai ser chamado de servidor de classe. E ele terá um nome de string privado. E a string privada. Esse nome de string público. Com o GET. Vamos lá. Isso retorna o nome e o conjunto que retorna nome igual a valor. Tudo bem, então temos essa aula pública. Vamos chamar esse servidor da empresa, desculpe. E teremos essas funções reaproveitadas. Portanto, temos essas funções obsoletas e o resto começa e a adicionamos nas funções de adestramento. E aqui, no geral, podemos criar um servidor a partir do novo controlador de domínio do servidor da empresa. E por que está chorando? Ele não tem construtor, é claro, porque precisa ser definido. Portanto, público, servidor da empresa , string, nome e o nome são iguais ao nome. Tudo bem, agora temos o construtor e teremos as informações do membro. Informação é igual a tipo ou tipo maluco de fama, mas sim o servidor da empresa. E a matriz de objetos com o atributo será a informação, obtenha atributos personalizados. Morra o atributo da empresa e um falso. Tudo bem? E depois disso, podemos usar o loop foreach para iterar sobre cada atributo de objeto em atributos. Em seguida, basta usar o atributo da empresa C igual ao atributo da empresa, atributo. Você. E cones na linha certa. Cifrão, citação, um, nome e um local ou não. B. C, esses locais, desculpe. E podemos usar os da tecla três para manter o prompt. Tudo bem, agora, como você pode ver, conseguimos obter o atributo de uma instância específica. E é assim que você pode usar atributos predefinidos comuns em C-Sharp. Vejo você na próxima vez. 18. C# Avançado Leia only somente para leitura: Bem-vindo. Neste vídeo, falaremos sobre três, as únicas propriedades automáticas em C-Sharp. Portanto, leia somente as propriedades automáticas. O que eles são? Nós divergimos e seis têm C-sharp lançado em 2015. Então, sete anos não acompanharam o visto Studio Ultimate. Esse foi um recurso muito exclusivo implementado. Isso é chamado de propriedade automática somente leitura e às vezes chamada de propriedade automática somente getter. Então, neste vídeo, vamos pegar o conceito de campos e propriedades e ver como ambos podem ser somente leitura e como eles são implementados, focando no aspecto de propriedade automática. Então, medos versus propriedades. Esses dois conceitos giram em torno da ideia de abstração. Com a turma. Você pode ter campos e propriedades. Os campos são membros variáveis normais ou de classe. Por que eu escrevi carro? Uma aula de carros? E as propriedades são uma abstração que permite obter ou até mesmo definir seus valores. Então, por exemplo, poderíamos criar a classe de campo público e lamentaríamos, classe, ok. Nome da string privada e função de string privada. E o que podemos fazer é definir esses chamados campos em um construtor de construção. Então, o servidor público foi curado, teríamos o nome da string, a função da string. Aqui. O que gostaríamos de fazer é dizer que esse nome é igual ao nome. E essa função é igual à função. Quando definimos campos, devemos nos certificar de que os definimos como privados. Isso garante que não estamos violando o conceito de encapsulamento. Resumindo, o encapsulamento significa que estamos construindo os campos, mas estamos agrupando os campos ou dados com métodos e funções capazes de manipulá-los. E não expomos esses dados para manipulação direta. E esse código atual não é realmente suficiente porque não podemos recuperá-los. Então, o que temos que fazer é ir em frente e definir o seguinte nome de string pública, nome. E usaríamos para obter para retornar o nome e o conjunto, o conjunto, o nome para o valor. Teríamos a função de string pública e obteríamos a função e definiríamos a função como valor. E agora temos, agora temos a opção de ler e modificar as propriedades. Então, vamos ver nosso resfriado. Portanto, o campo do servidor é igual a um novo campo sanduíche. E o nome é DC. A função no fio prateado é uma. E a função é controlador de domínio. Tudo bem? Agora, o que podemos fazer é usar a linha certa do console, a impressão, um nome e uma função. E não se esqueça do console que tem três chaves. Então, quando executamos esse exemplo, essa é a saída. Então, nós os definimos e acessamos com sucesso, e inicializamos nossa classe com um construtor mais tarde, os campos foram alterados com a ajuda de acessadores de propriedades. E também obedecemos ao princípio de encapsulamento. Agora que esclarecemos o conceito, podemos temperá-lo com o aspecto somente leitura. Quando queremos criar um campo somente leitura, só precisamos usar a palavra-chave Somente leitura. Então, se modificarmos isso para somente leitura, então podemos ver que o nome sublinhado ficará vermelho. E neste caso de um número de medo, isso significa que só temos uma chance de inicializar o campo com valor. Isso acontece quando chamamos o construtor construtor e começamos a receber um anúncio ou de tal tentativa. Portanto, isso pode ser removido com segurança. Se executássemos isso mais uma vez, você pode ver que está funcionando bem. Mas se eu tentar dizer que o nome é igual a novo nome, o que devo ver é que esta é uma propriedade somente leitura e não pode ser modificada. Tudo bem? Então, no caso do número do campo, tudo bem? E vimos a saída. Portanto, é assim que você pode usar propriedades Alto somente leitura em C-Sharp. Vejo você em. 19. Síntaxe avançada para literais: Bem-vindo. Neste vídeo, falaremos sobre como você pode reconhecer a sintaxe para alfabetização, incluindo sequências de salto de deck Unicode e sublinhados em C-Sharp. Então, vamos direto ao assunto. Mais tarde nós em C-Sharp e nada mais do que valores fixos. Esses valores são usados por variáveis ou constantes. Existem muitos tipos de literais, como inteiro, ponto flutuante, caractere, string, booleano. E se dermos uma olhada em literais inteiros, isso seria um exemplo. E é um tipo de literatura que diz respeito a números inteiros. E existem basicamente três subtipos, decimal, octal e hexadecimal. Esse é o decimal. O que poderíamos fazer é criar o octo, que é o, oh, vamos lá. E oito. E agora 028. E podemos ter o hexadecimal, que é 0 x um, C por exemplo. E basicamente o que poderíamos fazer é seguir em frente e usar os cones ou a linha da esquerda para a direita. E digamos que o nome da variável de a tenha valor. E faça isso por todos os três. Então isso é para o O e o H. E não se esqueça do cólon, então leia a tecla. Então, se o executarmos, é isso que temos na tela. Portanto, observe como o nome de nos permite nos referir ao nome de uma variável em nossa interpolação de string. A outra coisa que podemos não notar é como os valores aparecem no caso de hexa e número octal. E eles basicamente gostam dos prefixos de prefácio. Não vemos o prefixo hexadecimal ou o prefixo. O que podemos fazer é criar literais de ponto flutuante. Então, vamos criar o flutuador f k igual a 283848. E poderíamos ter o octo flutuante flutuante F B, que seria o 28 ou 27 menos cinco. E nós poderíamos O, desculpe, d e romance. Sim, agora parece estar melhor. Então poderíamos ter o 28º F. E agora o que podemos fazer é imprimir os valores. Então o a, o B e o C. E se o executarmos, observe como isso também tem a notação diferente quando é impresso na tela. Esta é a notação científica para os carros alegóricos. E também podemos ter literais de caracteres. Então car c é igual a, ou podemos definir a versão Unicode. Então você deve três O, seis. E vamos imprimir isso. , ca. Veja isso. Vejo você. Lá vamos nós. Portanto, esse é o caractere Unicode para o ponto de interrogação, por exemplo. E também podemos ter literais de string. E também podemos ter os literais booleanos. Vamos imprimi-los. Então este é o S. E isso vai ser a abelha. Vai ser a abelha. Lá vamos nós. E o que podemos ter também são sequências de escape Unicode. Então, por exemplo, essas são as sequências de escape que podemos usar. O Unicode me colocou em barras invertidas. Assim, podemos ter o caractere de arco, o backspace, a alimentação do formulário, retorno de carro, nova linha, torneiras horizontais, verticais, aspas simples, aspas duplas e a barra invertida também. E também temos que falar sobre sublinhado. Então, na minha experiência, esse tópico é um dos mais divididos entre os desenvolvedores. Uma razão para isso é que há aqueles que estão aprendendo Dó sustenido como primeira língua, tentando seguir as melhores práticas e guias de estilo de codificação. E também há aqueles que vêm de diferentes origens, como C, C mais Python ou qualquer outra linguagem. E eles tendem a nomear variáveis de forma diferente. E, é claro, cada empresa pode ter sua própria diretriz de codificação ou diretriz de estilo. E o que você pode fazer é dar uma olhada no estilo policial. E também o British Heart. Essas são ferramentas que permitem criar uma versão baseada em estilo ou guia de estilo verificado do seu aplicativo. Então isso era tudo que eu queria mostrar a vocês neste vídeo. Vejo você na próxima. 20. Como retornar avançadas referências lidas apenas a partir de funções: Bem-vindo. Neste vídeo, falaremos sobre três transformando referências somente leitura de funções. Portanto, esse tópico que você tem gira em torno do tipo e do código seguro de memória. Então, divergimos e um dos desenvolvedores liberados em C-sharp poderia passar argumentos para métodos por referência. Conforme o tempo passou e a programação mudou, a palavra, surgiram novos desafios que forçaram os novos recursos a serem adicionados ao C-sharp. Com a versão sete do C-sharp, dois recursos muito importantes foram adicionados. Uma era a possibilidade de declarar referências a variáveis locais e a outra era retornar por referência a partir de métodos. Construiremos a base para entender os dois tipos de argumentos. Passagem de argumentos. Então, qual é a diferença entre valor e finanças? Esses são dois tipos principais em C-Sharp e também temos a possibilidade de definir tipos personalizados, mas isso não está no escopo deste vídeo. Portanto, os tipos de referência mostram diferentes características de desempenho se olharmos por diferentes características de desempenho se baixo do capô, porque a própria natureza dessa implementação em que suas guias não têm nenhuma sobrecarga memorializa os dados que você pode armazenar em um tipo específico, como string inteira double, têm um tipo específico, tamanho específico e tipos de referência precisam adicionar campos extras. Um é o cabeçalho do objeto e o outro é a tabela do método. O cabeçalho do objeto é usado pelo common language runtime para armazenar informações adicionais e é basicamente uma grande máscara. Então, vamos dar uma olhada no struct. Portanto, estrutura pública somente leitura, uma dinâmica. E essa estrutura teria a string pública, Bob Lake string por nome, com o GET. E público duplo. De fato, relação com o GET e o público int, casos iniciais e dupla taxa de mortalidade pública. Agora podemos ter uma instância ou um construtor para a pandemia. E teria o nome da string, double ratio e int e double rate. E agora aqui na pandemia, teríamos o nome do vírus igual ao nome, a proporção é igual à proporção de fato. E o caso é, desculpe. De fato, a proporção deve ser igual à proporção. E o caso inicial, isso deve ser igual a k é, é, e a taxa de mortalidade deve ser igual à taxa. E podemos ver que os acessadores são lidos, são definidos apenas com get e o conjunto está faltando. E não lemos apenas a palavra-chave que diz ao CRL que nossa estrutura será imutável. Isso significa que, com o tempo, os campos não podem ser alterados. Agora gostaríamos de combinar esse homem, O aspecto acima mencionado, que é a estrutura e os valores de passagem por referência para criar uma demonstração para este tópico. Então, o que gostaríamos de fazer é criar isso. Tudo bem, então o alinhamento é bom. Classe pública, simples, ref, somente leitura. E teremos a matriz estática int com o novo int três. E vai ser 123. E o índice estático int get, int index. E devolvemos ao RAF um índice. E teríamos o vazio estático público para o nosso quê. Isso deve ser fechado. E aqui gostaríamos de usar os cones toda essa linha brilhante para obter o índice. Espera aí. É aqui que devemos colocá-lo. Obtenha o índice primeiro e use os cones ou a tecla de leitura. E podemos ver o valor que é um. Então, neste código, vemos uma matriz estática de inteiros com um tamanho de três. E nosso método GET index está tomando um índice como argumento e retorna um int em um jar de nossa matriz, que é radônio. Se passarmos o índice que é maior que o comprimento da matriz ou menor que 0, então obtemos uma exceção do índice fora do intervalo exceção. Então, se quisermos criar um exemplo mais complexo, poderíamos fazê-lo da seguinte maneira. Então, digamos que temos struct, que representa as salas de aula. Então isso tem o construtor, que está pegando um nome e o tamanho. E também tem um array privado de utilização atual. E tem um nome e as propriedades de tamanho, e assim por diante. Então, agora o que podemos fazer é seguir em frente e criar o seguinte. Então, temos um bar muito chamado quartos, e é uma nova sala de aula. E aqui gostaríamos de ter as novas salas de aula. Matemática com dez pessoas. E novas salas de aula ficam mais ricas com 20. E não vamos esquecer de fechá-lo. Podemos ter a escola var e ela tem novas salas de aula. E a escola. Essa sala de armazenamento vai ocupar as salas que serão inicializadas. E então podemos usar os telefones com toda a linha certa para imprimir a escola que recebe a utilização. 10. Se você executá-lo, poderá ver a utilização diferente da sala de aula. E é basicamente assim que você pode criar suas próprias referências somente leitura para serem retornadas de funções em C Sharp. E tecnicamente, isso era tudo que eu queria te mostrar. Vejo você na próxima. 21. Método avançado de C # sem um nome: Bem-vindo. Neste vídeo, falaremos sobre métodos sem nome. Portanto, este é um conjunto de recursos em C sustenido que é muito importante entender. Esse conjunto de recursos gira em torno de lambda, expressões lambda, delegados e métodos anônimos. Vamos ver como você pode usá-los. Primeiro, vamos falar sobre delegados. Então, normalmente funciona ou pausa um ou mais parâmetros ou nada. Geralmente eles retornam algo ou realizam operações específicas com dados ou textos que possuem. Estamos falando de delegados quando gostaríamos de passar a própria função como parâmetro. Vamos ver o que o C-sharp tem a oferecer. Primeiro, gostaríamos de criar um delegado. Por exemplo, teríamos o servidor Linux de string estática pública, que tem o nome da string, estado da string. Teríamos a verificação se o estado é igual a up, então retornamos. O servidor é. Caso contrário, o que gostaríamos de fazer. Se o estado estiver em baixo. Então podemos retornar o servidor está fora do ar. E, finalmente, retornar estado desconhecido. Tudo bem. Então, isso funciona com o problema de ter entre aspas duplas. Ótimo. Tudo bem. Agora, o que temos que fazer é criar uma reação de estado de string delegada com o servidor de string e o estado da string. E temos que definir a a string estática pública do Windows Server com o nome da string e o estado da string. E o que gostaríamos de fazer para devolver o servidor está no estado. Estado com o cifrão, é claro. E devemos movê-lo aqui dentro do programa. E aqui gostaríamos de criar uma reação estatal. Linux é igual à reação do novo estado. E usaríamos o servidor Linux. E a reação de estado Windows, nova reação de estado Windows Server. E gostaríamos de fazer o seguinte console, linha direita, Linux, bind e up. E teríamos outro Linux que é LDAP e temos o seguinte. Então, agora gostaríamos de ter essa reação do estado ou apenas vê-la em ação ao vivo. Então, qual é o problema? Como você pode ver, não há problema. O servidor está ativo, então está basicamente funcionando conforme o esperado. E sim, poderíamos estender ainda mais a funcionalidade dessas coisas com a verificação remota ou abertura de tíquete se você estiver em uma grande infraestrutura corporativa, mas vamos tecnicamente. Então, agora vamos falar sobre métodos anônimos. Então, na seção anterior, foi discutido como os delegados são tipos de referência e usados para referenciar qualquer método que tenha a mesma assinatura. Em contraste com elas, as funções anônimas tratam de analisar bloco de código ou código como um parâmetro delegado. Vamos criar o exemplo a seguir. Delegado público. Estado vazio, o estado da string. E no vazio estático principal, o que gostaríamos de fazer é criar o escopo externo, que é 99. E o estado S vai ser um delegado. E será um delegado de estado de string. E basicamente o que gostaríamos de fazer é usar a linha certa do console. E o estado foi inscrito. Vamos fazer uma string f e fechar o console. Linha certa. Sinal de dólar. O valor do escopo externo está fora do escopo. E nós vamos enviar D para cá. E se o executarmos, devemos fechar este também. Devemos ver o seguinte. O estado para cima e terceiro, e o valor do escopo externo é 99. Então é assim que você pode definir métodos anônimos. O último deve ser parâmetros lambda que verificamos quais expressões lambda. É uma função anônima que pode conter expressões e declarações. Então, vamos criar o seguinte. Teremos a função string, string. E será um nome bem-vindo. E definimos o nome de boas-vindas de retorno. Peso, claro, o cifrão. E não se esqueça de fechá-lo. Então, agora podemos usar a linha certa do console para imprimir o polegar da riqueza. Danielle. Se o executarmos, você pode ver que estamos usando a expressão lambda. Poderíamos criar outro exemplo. Então int, int n 34 é igual a x e retorna x vezes três. E então podemos imprimir a entrada 0.5. Deveria ser 15. Então isso era tudo que eu queria mostrar a vocês neste vídeo sobre expressões Lambda, delegados e métodos anônimos. Vejo você na próxima. 22. C # Advanced LINQ: Bem-vindo. Neste vídeo, vamos dar uma olhada na sintaxe de consulta integrada à linguagem, que é a versão longa da sugestão vinculada. E foi introduzido em outra estrutura dotnet com a versão 3.5 em 2007. E o conceito central era estender a estrutura e, junto com ela, a linguagem C-sharp com recursos de expressão de consulta. Por exemplo, se formos criar um exemplo, podemos criar uma string ArrayList. E que contém lista de servidores com a nova string de lista. E gostaríamos de ter o controlador de domínio do tear de sino de garrafa. E prótese, que é o DNS. E a chave, que é o ACP. E basicamente essa é a estrutura que você pode definir na função principal. É assim que podemos demonstrar isso. Portanto, d c é igual a list, server list, onde S, S contém Domain Controller. E vamos movê-lo aqui dentro do principal. Então agora podemos usar a linha certa do console, a impressão, os DCs. E como você pode ver, esta é a lista de EECS. E tem basicamente uma execução adiada. Então, para nos aprofundarmos na fila vinculada e quais outros benefícios existem para comer, precisamos entender o que é a execução adiada. Na maioria dos casos, durante a compilação, as expressões de link são avaliadas em um conjunto de dados específico e as variáveis inicializadas com os valores filtrados. Ao implementar a execução adiada, podemos economizar recursos valiosos de CPU e RAM. Porque o conceito nos permite não avaliar uma expressão específica ou atrasar a avaliação até que o valor realizado seja realmente necessário. Há dois casos em que é muito útil. A primeira é quando seu aplicativo está trabalhando em vários gigabytes de dados ou até mesmo terabytes de dados. E a segunda é quando você encadeia várias consultas que resultam em diferentes manipulações dos conjuntos de dados. Portanto, temos uma palavra-chave sobre a qual precisamos falar. E isso é rendimento. Para aprofundar nossa compreensão das diferentes execuções, precisamos introduzir uma palavra-chave chamada yield. E isso foi introduzido com a versão 2 do C-sharp. É com o Vita para avaliação preguiçosa e melhorar o desempenho das consultas LINQ. E o rendimento da palavra-chave é o contexto que você está, o que significa que ele pode ser usado como um nome de variável sem problemas. Então, vamos criar um pequeno aplicativo. Aqui. Gostaríamos de ter um servidor de classe pública. E tem um nome de string e uma função de string. E temos o nome da string pública com o Get. Isso é suposto retornar o nome. E o conjunto, que supostamente define o nome é igual ao valor. E temos o mesmo para a função até agora, função de string sombria. E usamos a função, esqueça a resposta. Tudo bem. Também teremos construtor, então servidor público. E esse construtor vai usar o nome e a função. E definir função é igual a função. Nome é igual a nome. Tudo bem? E basicamente isso sobre a classe do servidor. E vamos ter outra aula pública, que é o programa provisório. E aqui gostaríamos de criar um I estático público inumerável para o servidor, o banco de dados do servidor. E aqui precisamos definir o seguinte. Teremos uma matriz de servidores com os servidores. Essa é apenas uma nova instância do servidor. E essa instância será preenchida pelo novo servidor ou pelo empréstimo incorreto e pelo controlador de domínio. E nós vamos ter o que quer que seja e onde quer que seja. E um deles será o HCP e o DNS. Tudo bem. Isso agora está fechado. E o que gostaríamos de fazer é ter o S para cada servidor nos servidores e gerar o retorno S. Então, agora temos os sublinhados perdidos. E o que podemos fazer no domínio é usar o forEach no banco de dados do servidor. E simplesmente use a linha direita do console, cifrão e use o nome do ponto S e a função do ponto S. Agora, se executarmos, você pode ver que temos a execução adiada demonstrada e somos capazes de iterar sobre o INR I inumerável. E a chave aqui é o rendimento. Então aqui o retorno S, que nos permite iterar sobre cada elemento da nossa lista de servidores. E não retorna a lista inteira de uma só vez para salvar o MOD conhecido e melhorar o desempenho. Este também é um exemplo de execução adiada. Como o loop for each estava retirando os termos um por um. E devemos considerar a diferença entre Lizzie e execução ansiosa. Então, ou avaliação também. O uso da avaliação lenta significa que apenas um único elemento da coleção de origem é processado durante a chamada para o iterador. Então, algo assim. E um iterador pode ser uma classe acostumada ou um loop foreach ou abide dependendo do contexto. E isso era tudo que eu queria mostrar a vocês neste exemplo. Vejo você na próxima. 23. Interpolação de cadeias de caracteres avançadas C #: Bem-vindo. Neste vídeo, falaremos sobre interpolação de strings. interpolação de string tem algo a ver com a impressão no console. E é basicamente uma tarefa comum. Podemos imprimir uma mensagem de status simples, o resultado de uma ação específica. Realmente não importa. O que importa é a flexibilidade de nossas declarações de impressão. E também importa como isso se encaixa no fluxo do programa. Por exemplo, devemos considerar o seguinte. Portanto, a interpolação de string pode usar três tipos de variáveis: substituição, acesso a matriz, expressões e chamadas de método. O aspecto mais importante da interpolação de string é o caractere de cifrão. Então, por exemplo, string where, onde deveria ter score e string what? Tomate. E você pode usar a linha de gravação de pontos do console para imprimir. Comprei e usei a linha de gravação de pontos do console, não a linha direita, o console, li T. E se o executarmos, você pode ver que esses valores variáveis eram bem interpoladores. E basicamente o que podemos fazer é interpelar matrizes também. Então, vamos criar uma matriz inteira que contém os números pares 2468. E agora podemos usar a linha de escrita de pontos do console que a política. Portanto, o primeiro, o segundo, terceiro e o quarto são números pares. E lá vamos nós. Isso deve ser o primeiro e deve ser números pares. Tudo bem, então agora a saída parece estar boa. O que podemos fazer é também interpelar expressões ou intercalar com expressões. Portanto, temos dois valores, x, x é igual a oito e y é igual a dez. Poderíamos usar o seguinte para imprimir uma saída bem formatada. Então X mais Y é igual a X mais Y. E poderíamos dividir vezes e talvez menos. E se for agudo esse exemplo, devemos ver o seguinte na saída. Portanto, você tem a opção de avaliar expressões quando estiver interpolando. Você também pode criar uma função que terá a estática int fourth power int x. E ela deve retornar x vezes x vezes x vezes x. E aqui no console. E poderíamos escrever x para o quarto é quarta potência x. Dessa forma, interpolamos a própria chamada de função, e também podemos interpelar com alinhamentos. Então, vamos criar a variável workers, que é um novo dicionário de string e string. Aqui, poderíamos dizer que temos o John, igual ao DevOps. No entanto, John é igual a subir de nível para adicionar. Aqui, o que podemos fazer é usar a linha certa do console. A impressão que temos. Isso deve ser menos 15. E devemos ajudar a posição com o 20. E use o para cada loop. Em trabalhadores. Aqui, imprima a chave do título. E o valor do título deve ser K maiúsculo, K. E se executarmos isso, você pode ver que temos o ritmo aqui. Nisso. Espera aí. Deveria ser assim. Parece melhor. Então isso era tudo que eu queria mostrar a vocês sobre interpolação de strings. Vejo você na próxima. 24. Valor avançado C # e atribuição de tipos de referência: Bem-vindo. Neste vídeo, vamos falar sobre um tópico interessante em C-Sharp, que é chamado de valor e atribuição de tipo de referência, tão bem e gráfico. Então, vamos criar o projeto. Portanto, com base no sistema de tipos de uma linguagem de programação, existem duas categorias principais. Existem linguagens de programação de tipo forte e fraco. E essas categorias definiram como as regras de digitação se aplicavam durante a compilação e o tempo de execução do código-fonte. Em 1974, Barbara Liskov e Stefan zeros definiram uma linguagem de programação fortemente tipada da seguinte maneira. Sempre que o objeto é passado da função de chamada para a função seu tipo deve ser compatível com o tipo declarado na função de código. Então, vamos dar um pouco de contexto e dar uma olhada em como e qual é a diferença entre eles. Portanto, na estrutura dotnet e toque na linguagem de programação c-sharp, existem dois tipos principais. Um é chamado de valor e o outro é um tipo de referência. Esse é outro termo chamado contextos. E há dois contextos em dó sustenido. Um é chamado de seguro e o outro é chamado de inseguro. Explicaremos isso mais tarde, mas deve-se mencionar que, em contextos inseguros, temos um terceiro tipo chamado ponteiro. Por enquanto, basta, sabemos o contexto seguro quando o contexto é seguro, quando o código está sendo executado sob a supervisão do CLR. Existem quatro tipos que se enquadram na categoria de tipo de referência. Strings, array, classes e delegados. E o resto dos tipos para se enquadram na categoria de tipo. Então bool de carro, decimal e assim por diante. Vamos dar uma olhada no tipo de valor. Então, digamos que temos uma função, estática pública, vazio ao quadrado. E recebe um duplo como argumento. E o que vamos fazer é usar a linha direita do console e basicamente x vezes x. Agora podemos declarar uma variável a, que é Stan, e usar o console. Ou melhor, simplesmente chame o quadrado duplo de um. E vamos dar a ele uma tecla de leitura de ponto do console. Agora, se o executarmos, devemos ver a saída como 100. Então, o que acontece nos bastidores? O valor desse conteúdo é alocado na pilha e um único espaço na memória com base no tipo é reservado na mamária, essa variável retém diretamente o valor. Então, se fôssemos copiar esse valor para outra variável e atribuição, o valor seria copiado. Portanto, você terá o valor desses resultados duas vezes, duas vezes na pilha para cada variável. Cada tipo de dados predefinido em braços e até estruturas. Ou dessa forma. Os tipos de valor são criados em tempo de compilação. Por causa disso, eles são protegidos do coletor de lixo. Ele não pode acessá-los. Agora vamos dar uma olhada no tipo de referência. Então, digamos que temos um servidor de classe pública. E esse servidor terá um nome de string, public e CPU e public na RAM, ou apenas torná-lo duplo. Então, agora o que podemos fazer é criar o público e anular a inicialização. E vamos ter uma categoria e o servidor S como argumentos. Portanto, caso a categoria seja pequena , o que gostaríamos de fazer é criar ou melhor, atribuir o tipo small. E o que gostaríamos, desculpe. Tipo de string pública. Então, como o tipo deve ser pequeno, como a CPU deve ser um e S, a RAM deve ser dois. Como se a categoria fosse média. Em seguida, atribuiremos um pouco mais de recursos e chamaremos isso de médio. Vamos ver dois núcleos, quatro GB de RAM. Se a categoria for grande, gostaríamos de atribuir as quatro CPUs grandes e oito GB de RAM. Caso contrário, gostaríamos de lançar uma nova exceção. Novo sistema, essa exceção e categoria de argumento devem ser pequenas, médias ou grandes. Tudo bem? Agora, o que podemos fazer é criar um servidor. O servidor será um novo servidor. Podemos chamar a inicialização. Espera aí. Deveria ser assim. Quadrado. Por que não está funcionando? Nós temos isso. Temos o servidor inicializado. E deve estar perto daqui. Então inicialize o servidor e um logotipo e ele já está definido. Então, vamos fazer com que seja e quadrado a. Portanto, não há argumento dado o servidor inicial. Então, vamos fazer isso pequeno. E Lee. Portanto, temos a string e o servidor S. Por que não é tipo de referência de classe pública. E temos o servidor aqui, e o servidor de strings e programas. Portanto, temos o pequeno meio e temos o servidor S, vazio estático público. Ótimo. Então, agora o que devemos ser capazes de fazer é usar a linha certa do console de cones com o cifrão e apenas mostrar os atributos. Então seja cpu, tipo e B que Graham. E vamos dividi-los. Tudo bem? Então, basicamente, é isso. Temos uma classe que é do tipo de referência. E isso é importante observar porque a função chamada initialize server, que está inicializando, leva dois argumentos. O primeiro é um tipo de valor e o segundo é um tipo de referência. O tipo que é onde a classe é passada, a função mudará as propriedades públicas da passagem de classe por referência com base na categoria. Nós passamos. Se passarmos por uma categoria que não está implementada, então um novo anúncio ou seu trono. Então isso era tudo que eu queria mostrar a vocês neste vídeo sobre valor e tipo. Vejo você na próxima. 25. Operador avançado de propagação da Nula: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre o operador de propagação em C-Sharp. Então, em 2016, há muitas coisas acontecendo. No dia 12 de novembro, houve um evento chamado Visual Studio connect head pela Microsoft no cilindro é lançado versão prévia do Visual Studio 2015 e a versão C sharp seis. Esta nova versão incorporou muitas mudanças que os desenvolvedores e a tecnologia da época exigiam. Apenas para mencionar alguns desses recursos, que era a propriedade auto somente leitura é a expressão do inicializador de propriedade automática, MAS os membros da função de TI usando operadores estáticos e condicionais mais recentes. Portanto, neste guia, daremos uma olhada nos operadores condicionais, ou mais comumente chamados de operador de propagação. Também existem pessoas por aí que se referem a esse recurso como operador de navegação segura. Para entender isso, precisamos apresentar dois novos operadores. O principal objetivo desses operadores é tornar a execução do código mais fluida e substituir a exceção de referência nula adição ou manipulação significativa. Então, vamos ver um exemplo para o operador de acesso de membro. Antes do c-sharp. C sustenido, o código abaixo não teria resultado em nenhuma exceção de referência. Então, temos esse estagiário ou grosseiro. Temos o vazio estático principal. Então, basicamente, esse é o código. E sim, temos um servidor e é isso. Então, agora o que gostaríamos de fazer é superar esse problema e podemos fazê-lo da seguinte maneira. Então, vamos ter um servidor de classe pública com o nome da string pública, que tem um getter e setter. Agora, o que gostaríamos de fazer é inicializá-lo. E teremos uma matriz de servidores, que será chamada de servidores. E teremos uma matriz de servidores com cinco servidores. Agora, o que gostaríamos de fazer é ter um servidor, S1 será o novo servidor. E o S1, esse nome. Isso vai ser o primeiro. Vamos ter um servidor, S2. E S2, o nome será o segundo. Agora, o que gostaríamos de fazer é atribuir aos servidores e aos servidores. Segundo. E então vá em frente. Para cada servidor S, N servidores. E simplesmente use a linha de gravação de pontos do console S, esse nome. Tudo bem. Qual é a verdadeira chave aqui é que agora, se o executarmos, devemos ver o seguinte resultado. Então, basicamente, precisamos de uma matriz de cinco ou, neste caso, dois elementos. E a pesquisa será preenchida com servidores, terá sua propriedade name também inicializada. Em seguida, iteramos no servidor e verificamos com o operador de acesso do membro se o nome do serviço foi inicializado. Ok, agora você pode estar se perguntando onde está a demonstração do elemento x, esse operador. E podemos facilmente converter o loop da seguinte maneira. Então, se comentarmos isso, poderíamos usar a linha certa do console e simplesmente dizer que os servidores questionam ou não vamos fazer dessa maneira. Mas por toda parte. Dessa forma. Para int eu igual a 0, eu menos de dois I mais, mais. E aqui gostaríamos de ter os servidores ponto de interrogação, ponto interrogação, nome, ponto de interrogação duplo e dizer que nenhum nome foi especificado. Agora vamos deixar isso funcionar por cinco. Oh, qual é o erro? Oh, eu preciso fechá-lo. Tudo bem. Portanto, isso não está definido como um objeto. Tudo bem, vamos convertê-lo. Então, essa é basicamente a demonstração para o operador de propagação neural. Essa é a sintaxe para isso, e é assim que você pode usá-la. E isso era tudo que eu queria mostrar a vocês neste vídeo. Vejo você na próxima. 26. C# Clojures Avançados e expressões da lambda: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre fechamentos com expressões lambda. C sustenido, a capacidade que permite que um método ou uma função referencie a variável não local, que valores são chamados de fechamento. Esse recurso é comumente utilizado em conjunto com a função lambda, que nada mais são funções anônimas que os desenvolvedores utilizam sobre as funções principais para fornecer uma maneira de flexibilidade. Vamos falar sobre variáveis não locais primeiro. Então, em C-Sharp, é possível acessar uma variável fora do escopo de uma função. E considere as variáveis normais x, pois dessa forma são chamadas de variáveis não locais. Se você, você também pode ouvir desenvolvedores se referindo a esse tipo de Fourier, mas como capturado muito capaz. E basicamente, o que podemos fazer para demonstrar aqui é o seguinte. Temos uma string estática, best, quase linear, e temos um vazio estático. Foo é o melhor. E podemos dizer que queremos que o console tenha a linha certa para imprimir. O melhor é o melhor. Tudo bem? E devemos mover esse buraco aqui. O que poderíamos fazer é usar a tecla de leitura de ponto do console e chamar a função quem é o melhor. É basicamente assim que as variáveis capturadas se parecem. E quais são as funções lambda. Já tínhamos um vídeo sobre lambdas, mas vamos tentar reiterá-lo. Portanto, há muitos artigos sobre lambda e eles sendo encerrados. E algumas pessoas tendem a concordar de alguma forma que existem, mas elas são apenas parte da verdade. E eu acredito que a Índia, como o partido da oposição, as funções Lambda podem ser implementadas como fechamentos, mas eles não são fechamentos em si. Isso realmente depende do contexto em que você usa seu aplicativo ou o ambiente. Quando você está criando comendo uma função lambda que não usa variáveis locais, ela deve ser implementada como fechamento. Assim, as expressões lambda podem assumir duas formas básicas, expressões lambda e declarações lambda. Então, para uma expressão de exceção lambda, poderíamos dar este exemplo. Portanto, ele pega dois valores booleanos e verifica se eles são iguais. E também podemos ter lambdas de declaração. E eles se parecem com isso. Então agora temos uma string e, em seguida, ela aceitaria essa string com a mensagem. Portanto, devemos observar como fechar a chave encaracolada também termina em um ponto e vírgula. Quando trabalhamos com lambdas de declaração, geralmente criamos várias expressões, encapsulando-as dentro de nossa função. O que gostaríamos de fazer é dar uma curva íngreme e combinar lambdas e fechamentos. Portanto, temos fechamento de classe parcial estático público, demonstração. Aqui. O que gostaríamos de fazer é criar o vazio estático público. Lá fora. Essa será nossa função. E dentro da função, teremos uma variável local Norte. E diz que o lambda baseado em fechamento. Agora vamos ter o funk, amarrar todos eles. E gostaríamos de usá-lo como um Lambda. E teremos a corda local. Este é o Lambda e o Plus local de retorno. Tudo bem. Depois disso, teremos uma mensagem de string, que é demo. E gostaríamos de usar a linha certa do console para imprimir a mensagem. E no domínio, o que poderíamos fazer é usar a demonstração de encerramento que está fora. E é isso aí. Então, vamos executá-lo. E aqui podemos ver como isso foi demonstrado. Então, vemos neste exemplo que a variável não local não mudou. No entanto, a situação pode nem sempre ser verdadeira. Se a variável mudar, a função de referência será afetada. Às vezes, esse é exatamente o caso que queremos alcançar. Por exemplo, poderíamos ter uma função que registra a alteração do terminal em um estado de função com uma função Lambda. Dessa forma, cada mudança de estado resultaria em um logotipo diferente. Então, agora podemos demonstrar isso com fechamentos, e aqui está como faríamos isso. Então, teremos uma variável foo, que é stem, e a função que é chamada bar. E simplesmente retorna para a linha certa do console. E usaríamos o bar completo. E podemos mudar o valor de foo para 20. E depois disso, teremos um lutador que é igual a bar. E poderíamos usar a linha certa do console para imprimir o lutador com o lutador. E é assim que podemos implementar fechamentos. E tecnicamente isso é tudo que eu queria mostrar a vocês neste vídeo. É assim que você pode usar fechamentos com expressões lambda. Vejo você na próxima. 27. C # Avançado Foreach e enumeradores: Olá e seja bem-vindo. Neste vídeo, falaremos sobre como entender geradores e enumeradores. E eu enumerador em C-Sharp. Então, um dos conceitos é chamado de geradores, o outro é iteradores. Vamos inspecionar como essas ideias são incorporadas no C-Sharp e verificar como você pode utilizá-las para nossa própria vantagem. Um gerador geralmente é uma função ou uma rotina especial implementada na linguagem que controla o comportamento de um loop. O gerador tem uma estranha semelhança. Duas funções que retornam uma matriz. Eles têm parâmetros e podem ser chamados para gerar uma sequência de tempos phi. Sem geradores, digamos que temos uma função que retorna uma lista de inteiros de cerca de 1 milhão de cada vez. Isso significa que as necessidades, a lista precisa ser construída na memória, alocar espaço para todos os valores e, em seguida, passar esses valores sempre que eles precisarem. Se tivermos os recursos, tudo bem. Mas as pessoas sempre se esforçam para descobrir algo para esses tipos de problemas. E os geradores nasceram. E os iteradores são como a contrapartida dos geradores. E o conceito remonta a 1974. Para a linguagem de programação C. Por design, um iterador deve permitir que o programador atravesse contêineres específicos, e é mais comumente usado para listas. Então, vamos ver um exemplo em implementação, temos uma lista de strings a serem iteradas, que é uma nova string de lista. E para ser iterado tem uma função add. E podemos dizer que programar é divertido. Agora, podemos converter essa lista em um gerador de forma muito simples. Poderíamos simplesmente dizer que é um I e uma string numérica. E, basicamente, precisamos mudar isso dessa maneira também. Então eu enumero arco, corda e aguento. Nós temos esse. E isso deve ser iterado. E precisamos mudar o outro também. Então, eu me curvo a ser iterativo. E o que podemos fazer agora é pegar o elemento for-each loop e dizer string em I inumerable e usar o elemento de linha direita do console. E se formos em frente e lermos a chave para aguardar a saída, é isso que vamos ver. Dessa forma, alteramos a lista para um gerador, que ela tenha uma pegada de memória menor. E aqui, basicamente, não há declaração de quebra. E, no entanto, não é infinito, então ele sabe como parar quando gostamos de esgotar então ele sabe como parar quando gostamos de esgotar a lista que gostaríamos de iterar. E podemos ver o chá dar um exemplo prático ou mais prático também. Por isso, gostaríamos de criar um pequeno aplicativo que possa processar os números se forem ímpares ou até diferentes. O enumerador ocular nos fornece uma solução elegante, seja, envolve dois métodos estáticos. Portanto, o primeiro método estático seria esse. E precisaremos usar o encadeamento do sistema. E o que gostaríamos fazer é ter o processo de auditoria também. Então, até mesmo processe qual processo. Então lá vamos nós. Então, o que acontece aqui? Nós tomamos um numerador ocular como argumento. E se a corrente for 0, dizemos que a lista foi processada saindo do que esperar por cinco segundos. Se for o módulo dois, então dizemos que o número está até chamando processador. E lá vamos nós. Então isso é para números pares e ímpares. E agora dentro do nosso principal, o que podemos fazer é criar uma lista int, que é chamada myList. E esta é uma nova lista de inteiros com valores de Dan para I vai de 0 a I, menos de dez I mais mais. E gostaríamos de usar o my list dot add para adicionar novos elementos. E depois disso, teremos o enumerador de olhos. E isso vai levar um número inteiro. Minha lista em m é igual a minha lista, pegue um numerador. Minha lista em num, vá em seguida. Processe ou mylist the num, e pronto. Então, vamos dar uma chance. E como você pode ver, a saída mostra que a lista foi processada saindo. Então é assim que você pode usar para cada enumerador de olhos em C-Sharp. Vejo você na próxima. 28. C # Advanced Static vs membros de instâncias: Bem-vindo. Neste vídeo, falaremos sobre como você pode distinguir membros estáticos e membros de instância. Portanto, a programação orientada a objetos gira em torno de dois termos principais em. Um é objeto e o outro é instâncias. Existem diferentes ideias teóricas que a linguagem de programação específica implementa. Neste guia, daremos uma olhada em membros estáticos e de instância. Vamos decidir os termos e o que eles são, como você pode utilizá-los em algumas regras muito simples. Então, distinguimos também três tipos de números diferentes. Podemos ter campos ou propriedades estáticas, métodos estáticos e classes estáticas. Então, vamos começar com as aulas. O que há com as classes estática e não estática são classes estáticas ou não estáticas. E temos classe não estática. Ele pode conter métodos, propriedades e até eventos. E você pode chamar isso mesmo sem instanciar a classe. Então, por exemplo, vamos criar um projeto para isso. Tem esse não. Então, por exemplo, vamos criar uma classe que chamaríamos de não estática. E aqui vamos ter uma string estática pública, sem instância. E na linha de gravação de pontos do console, imprimimos. Eu não preciso saber. Dan Shi é mostrado. Espera aí. Devemos ser devolvidos. Tudo bem. E o que também podemos fazer é, dentro de nossa classe interna, definirmos nossa string pública. Outra instância. E aqui não retornamos nenhuma instância aqui. Qualquer um. Se você for para o principal, depois de ter a chave certa. O que podemos fazer é usar a linha direita do console, a impressão, o resultado da função da função não estática sem instância. E também a linha certa do console. E outro não assim. Então, basicamente, se executarmos esse exemplo, você verá que chamamos a função da classe sem instanciação. Sem usar o modificador public, podemos chamar as estrelas conhecedoras da classe demo estática e não estática, e não herdamos nada disso em nossa classe principal. E você também deve saber a palavra-chave public quando invocamos outra instância do método de dentro de nossa classe principal e nível de acessibilidade está correto desta vez. Basicamente. Em outra redação, quando falamos sobre os membros da instância, falamos sobre os membros da classe que não podem ser chamados acessados sem instanciar a classe. Aqueles que podem ser acessados são chamados de membros. Então, por exemplo, se eu der esse número de string público não estático igual a qualquer coisa, então podemos acessar este. E quanto aos métodos estáticos? Por exemplo, se tivermos esse exemplo, isso será chamado de membros estáticos, um método estático. E quando você define um método estático, permitimos o acesso desse método somente a membros estáticos da classe e não podemos acessar membros da instância. E se eu fosse acessar essa variável membro a partir do método estático, ela ainda funcionaria bem. Então, agora temos que falar sobre propriedades ou campos estáticos. Portanto, quando temos um campo estático, precisamos ter em mente que esse campo identifica apenas um local de armazenamento na memória. E não importa quantas instâncias criemos isso será apenas uma cópia de um campo estático. Na maioria das vezes, como resultado do natural de sua natureza, propriedades estáticas são usadas para armazenar dados que devem ser compartilhados por todas as instâncias da classe. E se você quiser um exemplo para isso, podemos criar uma classe chamada counter. Aqui teríamos o público estático int down Cs igual a 0 e contador público. O que gostaríamos de fazer é usar as instâncias mais igual a um para aumentar o contador de instâncias. E quando vamos em frente e criamos uma nova instância a partir do balcão, o que podemos fazer é usar a linha certa do console. Imprima o número de instâncias. Aqui, o que faremos é usar o número da classe do contador, ou melhor, instâncias para imprimir o número de instâncias. Atualmente, se executarmos essa solução, veremos uma. Mas se você criar mais algumas instâncias. Então, digamos que esta seja a contagem 123. E se formos imprimir a nova contagem de instâncias, veremos que temos um total de quatro instâncias. E basicamente é isso. Então é isso que eu queria mostrar a vocês neste vídeo. Vejo você na próxima. 29. Inferência de tipo avançado C #: Olá e bem-vindo de volta. Neste vídeo, vamos falar sobre financiamento de digitação c-sharp. C sustenido é uma linguagem fortemente digitada. É para uma declaração é chamada de explícita. E isso significa que temos que especificar uma nova variável. Caso contrário, o compilador lançará um anúncio ou, com a versão três do C-sharp, uma nova palavra-chave foi introduzida e é chamada voir. E isso permite que os desenvolvedores armazenem qualquer tipo de valor de forma implícita, o que significa que o compilador decidirá por nós durante o tempo de compilação quando executamos a primeira atribuição acontece o que se tornar como um tipo dessa variável. E pode ser facilmente integrado ao link Q, que é a consulta integrada à linguagem. Antes da introdução da inferência de tipo, definiu explicitamente o que será uma string ou inteiro ou o que quer que seja antes do tempo de compilação composto. Então, definimos uma string com o valor padrão e assim por diante. E agora temos que falar sobre link q. Então q significa consulta integrada à linguagem. É um conjunto de tecnologias baseadas na integração de recursos de consulta diretamente na linguagem C Sharp. É muito semelhante à consulta. E o objetivo era filtrar os dados com base em critérios específicos e suportar maioria dos tipos de dados Slack, sequel, Zemo e assim por diante. E vamos criar um exemplo que supostamente demonstre exatamente isso. Então, vamos criar um servidor de classe pública. Dentro da classe pública, teremos um nome String público, que tem um getter e setter. E teremos um sistema operacional String público com o getter e setter. E depois disso, o que gostaríamos de fazer para criar uma nova energia solar. E isso basicamente não é apenas um novo servidor, mas a lista de servidores. E gostaríamos de ter isso como uma nova lista de servidores. Aqui. O que gostaríamos de fazer é o seguinte. Então, queremos instanciar esses servidores. Vamos lá. E nós temos um novo servidor, que vai ter um nome, que é como, o tear e um sistema operacional, que será quando? 2019. E faremos um pouco mais. Tão grande garoto. Este será um modelo CentOS oito e Ricky , que será nove. E agora o que podemos fazer é criar uma consulta ao servidor, que será do servidor nos servidores. E gostaríamos de ter o sistema operacional do servidor filtrado para o IBM nove e fechar isso. Portanto, temos essa lista e temos que adicionar o novo servidor selecionado, o sistema operacional do servidor de nomes e fechá-lo. E depois disso, podemos usar o servidor foreach var, consulta do servidor e simplesmente usar o servidor da linha direita do console. E vamos dar a ele que os cones têm cerca três chaves e executá-lo. Agora, como você pode ver, aqui, temos o resultado do filtro. E o que vemos aqui? Estamos usando dois namespaces adicionais. Um é chamado genérico e o outro é fila vinculada. E o primeiro nos fornece a implementação da estrutura de dados de lista, onde armazenamos nossos servidores. E os segundos anúncios, os recursos de link para o nosso aplicativo após a inicialização da lista com os servidores. E é aqui que a mágica acontece. Então, primeiro definimos nossa variável que contém a consulta é arts, e então a consulta é feita. Que procura servidores mais baratos do que ou não mais baratos, mas sim o sistema operacional sendo WAN 19. A palavra-chave walk nos permite decidir o tipo de corpo durante o tempo de execução. E tecnicamente isso é tudo eu queria mostrar a vocês neste vídeo. Vejo você na próxima. 30. Funções locais avançadas: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre funções locais em C-Sharp. Assim, as funções locais, esse recurso tornou-se parte do C-sharp com a versão 7. E a ideia por trás desse recurso é a definição de uma função. Fizemos outra função. E é semelhante à forma como os decoradores Python funcionam. Se você estiver familiarizado com o conceito e quiser reformulá-lo, poderíamos dizer que a função local é uma função privada de uma função e seu escopo. E está limitado à função dentro da qual foi definido. Dissecaremos esse tópico mais adiante neste vídeo. Portanto, o tipo de função de pesquisa se assemelha ao tipo da função de contêiner. No entanto, não há uma aplicação estrita de regras do lado do compilador. E quando temos uma função local, também podemos usar modificadores assíncronos e inseguros. Portanto, inseguro refere-se a ponteiros em C sustenido em assíncrono está se referindo a assíncrono. E lugares comuns onde as funções locais são definidas. Nossos construtores de métodos, fonte de acesso à propriedade, acessadores de eventos , expressões lambda, analisadores ou destruidores phi e funções locais. E um recurso muito útil da função local é que eles permitem exceções apareçam imediatamente quando estamos usando iteradores, por exemplo, exceções só aparecem quando as enumeramos. Então, vamos criar uma pequena demonstração. Aqui. Gostaríamos de ter uma mensagem vazia, string, digamos. E usamos o console. Certo? Linha. Diga. Vamos usar os cones ou a tecla de leitura para obter informações. Agora, o que gostaríamos de fazer é dizer a mensagem, bem-vindo. E se o executarmos, veremos o seguinte resultado. Agora, essa é basicamente a forma mais simples de funções locais. No nosso caso, temos a função chamada message, que pega uma string como argumento e envia para o console a mensagem. E vamos criar outra demonstração com escopos variáveis. Então, por exemplo, temos aqui int k igual a 11 e o duplo j é igual a noventa e nove ponto nove. E teríamos o escopo vazio. E usamos a linha certa do console para imprimir o nome. O valor do nome de. Isso deve ser uma string f. E passaríamos dois argumentos também. Então, em X em Y está X e Y. E gostaríamos de usar o K e o J também. Vamos lá. K e J. J e K. E não precisamos desse nome. Na verdade, precisávamos disso. Então, agora o que gostaríamos de fazer é usar o escopo. Vamos fazer disso uma string em vez de 1299 e apenas executar. Então, como você pode ver aqui, as variáveis locais chamadas k e j são acessíveis para a função conforme são definidas dentro da função de contêiner. E o que gostaríamos de fazer é criar uma função genérica. Então anule a função genérica. E nós teremos o valor com o valor X. E vamos para este. E nós teríamos que os cones à direita é igual a este como o anterior. E chamaremos essa função. Nove, 11 que se você executá-lo, o valor de x é 11. Funções genéricas combinam tipo, segurança e eficiência. E eles são frequentemente usados com coleções e métodos que operam neles. E também podemos referenciar o parâmetro externo na função local que são declarados no mesmo escopo. Então, por exemplo, poderíamos criar o vazio my string x out string S. E S é igual a cifrão. Esse é o único. E agora teríamos a string message igual a null. E teríamos a mensagem My out 12 and out, a chamada de função e simplesmente usaríamos o console com a mensagem da linha certa. Então, agora nós o executamos. Você pode ver que o valor de x é 12º. A atmosfera é variável, captura a mensagem e trabalha em conjunto com a string como argumento da função. E poderíamos usar também a palavra-chave params void, meus antebraços, armas de fogo na matriz. E cones. Entendi a linha brilhante. E aqui poderíamos dizer que obteve o número da tubulação. E teríamos elemento. E para cada elemento na matriz. Dessa forma, nosso loop for parece bom. E teríamos o teste, que é um novo array inteiro que tem o 123456789. E agora podemos usar a parte de baixo ontem. E lá vamos nós. Então, basicamente, é assim que você pode usar funções locais em C-Sharp. Vejo você na próxima. 31. C# Advanced Custom accessors de eventos: Olá e bem-vindo de volta. Neste vídeo, vamos dar uma olhada em como você pode escrever acessadores de eventos personalizados em C-Sharp. Portanto, para entender o eixo de eventos do cliente, precisamos esclarecer por que eles são necessários e os casos de uso. Aqui vamos apresentar o conceito de eventos e dar uma olhada nos eventos e acessadores que podem ser usados para interagir entre as aulas. E o que são eventos. Então, vamos dar um exemplo animado. Temos uma interface gráfica do usuário que consiste em botões, texto, caixas, rótulos e assim por diante. Cada componente é composto por sua própria classe. Cada aula fornece funcionalidade. Por exemplo, você pode digitar na caixa de texto, clicar em um botão e assim por diante. E categorizamos as aulas por editores ou assinantes. O editor é uma classe que envia ou aumenta os eventos. E o assinante é aquele que recebeu o, recebe o evento com base em suas ações específicas. Portanto, existem algumas regras para os eventos. O editor determina quando um evento é gerado, o assinante determina qual ação é tomada quando um evento específico é disparado para o qual ele está inscrito. Eventos com nossos assinantes nunca são levantados. E os eventos são acionados principalmente devido às interações do usuário no aplicativo da web ou na interface gráfica do usuário. Por padrão, o evento tem vários assinantes e faz com que ele lide com manipuladores invocados de forma síncrona, a menos que definido de forma assíncrona e assíncrona. Os eventos são baseados na classe base do manipulador de eventos, delegado e logs de eventos. Para criar um evento, precisamos criar um delegado que contenha os detalhes dos assinantes de um evento e criar um evento público que seja visível externamente para uma classe e usado para criar assinaturas. Em seguida, criamos o método em uma classe que acionará o evento em si. Então, por exemplo, vamos fazer o seguinte. Vamos chamar essa classe pública de máquina. E supõe-se que essa máquina de classe pública tenha algo chamado private int utilization, que será 0, private int safe utilization, que será o nível de utilização sob o qual a máquina é segura para ser operada. E teremos um delegado público. Limite de estresse vazio x c manipulador de eventos, que terá a origem do objeto e os argumentos de evento E. E teremos um manipulador de limite de estresse de evento público excedido. Teremos um público que devemos anular devido ao estresse. Nível. C fez argumentos de evento E. E basicamente o que gostaríamos de fazer é ter o limite de estresse excedido o ponto de interrogação que. Invocar. Este E. Vamos trazê-lo aqui para que fique mais visível. E teremos um int público, quatro meses, que terá o getter. E isso retornará a utilização. E teremos o vazio estático. Máquina. O estresse limitará x c did object, source event args e. E gostaríamos de ter a máquina, que é igual à fonte da máquina. Uns. Tudo bem, linha. Aviso de nível de estresse. Você gostaria que o Mac ruim por meses e a pessoa assinasse. Agora, o que podemos fazer é criar o teste público de estresse vazio, utilização interna. E agora gostaríamos de, eu tenho a utilização antiga igual à utilização de sublinhado. E a utilização do sublinhado deve ser aumentada com a nova utilização. E se a utilização antiga for menor que igual para economizar utilização é maior do que a utilização segura. Então podemos chamar o nível de estresse excedido novos cães. Tudo bem, então, basicamente, esse será o teste de estresse para nossa turma. E em nossa função principal. O que podemos fazer é criar uma nova máquina. E podemos estranhar novo manipulador de eventos de limite de estresse para a máquina. Limite de estresse. Vamos lá. Z fez. E gostaríamos de usar os poemas nessa linha certa para dizer que a utilização é, esta vai ser uma máquina de f string que forma mal íons com um sinal de porcentagem. E podemos usar a máquina. Aquele teste de estresse. Digamos que isso vai ser 60. Escreveremos a utilização e, em seguida, criaremos outro teste de estresse para o quinto. E vamos fazer o 75 e usar os fóruns ou concordar em esperar pelo prompt. Agora, se executarmos esse exemplo, você pode ver que a utilização não vai mudar. Quero dizer, isso vai mudar, mas assim que tivermos excedido a utilização, recebemos o aviso para que o evento personalizado seja gerado. Então, esse foi basicamente um exemplo que mostra como você pode escrever seus acessadores de eventos personalizados em C-Sharp. Vejo você na próxima. 32. Conversões definidas por usuário avançado C #: Olá e bem-vindo de volta. Neste vídeo, falaremos sobre como você pode escrever conversões personalizadas definidas pelo usuário em C-Sharp. Foram essas conversões em C-Sharp ou todos os dias de pedestres para a maioria dos desenvolvedores. E nós o usamos para verificar se as entradas sólidas desafiaram o fluxo de trabalho de nossa aplicação. Eles são convertidos integrados, que são conversões incorporadas e recursos de suporte em C Sharp que permitem manter a flexibilidade e a consistência em todo o aplicativo por padrão, existem dois tipos principais de conversões. Um é chamado de x mais c, o outro é implícito. C sustenido também fornece uma maneira de você definir suas próprias conversões. Vamos dar uma olhada nas conversões explícitas. Então, por exemplo, temos um flutuador Pi, que é três para F. E temos um duplo B pi, que vai ser por. E podemos usar a linha certa do console, a impressão por d pi. Vamos dar uma olhada na saída. Então, como você pode ver, no primeiro caso, temos os três pontos 14 como valor. E o terceiro. O segundo caso é um pouco mais longo. Então, basicamente, o que vemos é como o flutuador é convertido em duplo. Essa é a diferença entre a precisão. É por isso que vemos valores diferentes. E o que também podemos fazer é basicamente seguir em frente e vamos chamar isso de E pi, d Pi. E aqui apenas dizemos que queremos ter um valor duplo. E isso vai ser o três que 14. E gostaríamos de criar uma versão flutuante disso. E F DEP. O que gostaríamos de fazer é usar o flutuador em d, d, p, y. E agora podemos escrever esses valores. Vamos executar nosso exemplo. Agora, como você pode ver, usamos a conversão explícita para criar os novos valores. Agora, o que podemos fazer é dar uma olhada em como você pode definir suas próprias conversões personalizadas. Então, por exemplo, temos a classe pública chamada conversões. E temos o tipo personalizado de classe pública. E este vai ter um número int público com seu getter e setter. O bool público, magia, getter e setter. E teremos um operador estático int, valor int de tipo personalizado. Dentro dessa função, gostaríamos de retornar um novo tipo personalizado com o número igual ao valor. E a magia era falsa. E aquele operador booleano público, desculpe, n. Depois disso, podemos definir nosso operador estático público com marcadores X, int, tipo personalizado, magic. E gostaríamos de voltar do número mágico. Tudo bem, agora temos nossa própria classe e podemos criar um número inteiro que é chamado de número. E vai ter o valor três. Depois disso, podemos criar um tipo mágico personalizado igual a um número. E podemos usar a linha certa do console para imprimir de int um número em magia com valor número mágico. E se fecharmos essa linha e executá-la, você pode ver que convertemos o número inteiro três em uma conversão definida pelo usuário, que tem o valor de três. Então, tecnicamente , é assim que você pode criar suas próprias conversões personalizadas definidas pelo usuário no C-Sharp. Vejo você na próxima vez. 33. C # Avançou o Fim: Bem-vindo. Este é o meu vídeo final desta série. Aqui na série, você aprendeu muitas técnicas úteis em C-Sharp, como você pode aprimorar seu aplicativo, como você pode implementar recursos avançados que permitirão que você construa mais robustos aplicativos. Vimos em muitos exemplos como você pode utilizar todo o arsenal que C-sharp tem para fornecer a você para tornar seus programas ou aplicativos mais bem-sucedidos. E todos esses exemplos serão carregados em um repositório do GitHub que você poderá clonar e reproduzir os exemplos que você vê nos vídeos. Vejo você na próxima. E espero que isso tenha sido informativo para você. E eu gostaria de agradecer por assistir. Tchau.