Transcrições
1. Recursos de linguagem de C#: Deixa-me fazer-te uma pergunta. Você gostaria de se tornar um C afiado especialistas? Quero dizer, a linguagem C afiada é muito legal. Mas se você aprender o idioma na escola ou no curso, então você é apenas o único aprendeu o básico. Você realmente não aprendeu as características de poder da língua. Então, o que eu estou tentando fazer neste curso é ensinar-lhes alguns
recursos avançados muito legais fora da linguagem C afiada. Então, por exemplo, vamos dar uma olhada nos métodos de extensão. Vamos dar uma olhada nas declarações de retorno de rendimento. Você tem alguma idéia do que você vai devolver faz e como você deve usá-lo? Eu vou te ensinar. Vamos dar uma olhada em expressões de link. Vamos dar uma olhada nos operadores condicionais nulos. Vamos dar uma olhada em alguns recursos avançados que foram introduzidos em C sharp versão seis. Então, por exemplo, vamos dar uma olhada em todas as horas de inicialização de propriedade, então eu vou dizer as propriedades que você inicializa. Vamos dar uma olhada em corpos de declaração, expressões. Então expressões escritas como uma função de Londres que você usou para inicializar um método tão coisas
muito legais. Assim, no final deste curso, você estará atualizado em cerca de 15 avançados recursos de linguagem Ver Shoaib que você pode usar para melhorar suas próprias vê ou c chamadas de fonte nítidas. Ele vai ajudá-lo a escrever menos casaco porque um monte desses recursos automatiza longe um monte fora código
manuscrito que você tem que escrever no passado sobre este conhecimento irá ajudá-lo a se tornar um desenvolvedor melhor. Então, você está interessado em se tornar um especialista em C afiado? Então este é o curso para você. Então eu criei este curso para meteoros júnior ou desenvolvedores sênior. Não importa o nível que você tem, quem quer levar seu conhecimento fora da linguagem C afiada para o próximo nível sobre este conhecimento vai ser realmente útil para você em sua carreira quando sua próxima promoção é você ou quando você está aplicando para um trabalho. Então, obrigado por ouvir. Espero estar te vendo no curso
2. Introdução ao curso: Oi. Bem-vindo a este curso. Apimente o seu casaco afiado C com recursos avançados de linguagem. Neste curso, vou ensinar-lhe uma lista fora Muito legal e avançado C. características de linguagem
afiada. Aqui está a cena sobre C. Sharp. A Microsoft lançou este idioma em 2002 há mais de 14 anos. Na época, C Sharp era pouco mais do que uma variante fora do Java com um conjunto de recursos um pouco mais poderoso . Mas ao longo dos anos, a linguagem evoluiu enormemente e amadurece em sua encarnação atual. Na versão seis de hoje, C Sharp é ambos fortemente formigas, objetos
dinamicamente digitados, tias, componentes orientados, imperativo
genérico, declarativo na linguagem de programação funcional Isso é um bocado cheio de boca. A Andi. Ele impulsiona o ponto de partida que C Sharp é uma linguagem de programação multi-paradigma. Ele contém recursos de mais de um paradigma de programação. Aqui está uma pequena lista. C Sharp é orientado a objetos. C. Sharp também é declarativo porque suporta atributos. Mas C Sharp também é funcional porque suporta link em expressões Lunda em D. C. Sharp é dinamicamente tipos porque suporta variáveis dinâmicas. C Sharp é repleto de recursos em. É bastante normal ter palavras com a linguagem por anos sem nunca tocar em uma característica
específica. No meu caso, posso dizer honestamente que nunca usei as palavras-chave dinâmicas em nenhum dos meus projetos. Apesar das minhas décadas de longa experiência com C Sharp em. Isso é exatamente o que me deu a inspiração para fazer este curso. Não seria ótimo se tivéssemos todos os recursos legais e úteis fora de grupos afiados C juntos em um curso útil? E assim, neste curso, eu vou te ensinar 10. Muito legal, menos conhecido em recursos avançados de energia fora da linguagem costeira. Eu também vou dar-lhe uma boa visão geral sobre os novos recursos que a Microsoft introduziu Inversion seis fora da linguagem nítida C. Vou começar cada seção com uma visão geral sobre o que você vai aprender, e vou terminar a seção com uma recapitulação sobre o breve questionário que você pode usar para testar seu conhecimento. Se você falhar, a cidade quiz para se preocupar é apenas re ler a palestra correspondente sobre, em
seguida, tente novamente. E se algo não estiver claro para você, sinta-se à vontade para entrar em contato comigo. Fico feliz em responder a qualquer pergunta que possa ter. Até o final do curso, você terá uma compreensão sólida de muitos avançados ver recursos de linguagem curta, e ele estará totalmente atualizado em todos os novos recursos que a Microsoft introduziu Inversion six. Ok, então agora você deve estar se perguntando, quem é esse cara? O que ele sabe sobre C Sharp? Olá, Olá, meu nome é Mark Finegar. Deixa-me contar-te um pouco sobre o meu passado. Estudei física na Universidade de Utrecht, na Holanda. Após a formatura, comecei minha carreira em uma pequena empresa chamada Vision. Eu me diverti muito e trabalhei até gerente de projeto, e me tornei amigo íntimo do diretor de arte da empresa. No ano de dois milhares, decidimos nos unir e formar nossa própria empresa chamada Design State. Aqui está uma foto de grupo de três anos depois. Nós crescemos para 12 pessoas em apenas três anos, e trabalhamos em todos os tipos de projetos legais. Por exemplo, aqui está um telefone de vídeo que construímos para o milionário da Internet
holandesa, ecoou Vincent. Nós programamos o dispositivo em revestimento afiado C que funcionava nos compactos de ponto net. Trabalho de chuva em um smartphone compacto. Infelizmente, Design State foi falido em 2003, mas eu continuei a trabalhar em projetos legais. Aqui está uma prateleira de supermercado em que trabalhei. A coisa legal sobre esta prateleira é que ele construiu, ou se eu d antenas para que ele pudesse enviar. Quando os produtos foram colocados no dele, programei tudo em C Sharp e um Speedo. Em seguida, em 2007 eu me reuni novamente com meu antigo parceiro de negócios, e nós formamos uma nova empresa chamada First Focus. Então aqui estão outros projetos legais que fizemos juntos. Este é um site de comércio. É um ovo, uma rede de Speedo. Projetos de formulários molhados nele são executados em uma nuvem fora de servidores Lena. Fomos ao vivo há alguns anos em que conseguimos resultados espetaculares. O site contém 100.000 produtos em mais de 7000 categorias. Tem facetas de vida. navegação nos dados renderiza páginas em uma fração de segundo. Então, aí está. Tenho usado C afiado há pelo menos 14 anos. Eu trabalhei em alguns projetos muito legais e eu adoro compartilhar minha experiência C afiada com você . Minha carreira no I T agora tem mais de 20 anos. Nesse tempo, comecei a trabalhar com empresas de tecnologia. Quero dizer um CDO quatro vezes, e eu lecionei em salas de aula por cinco anos, e eu trabalhei em muitos, muitos grandes projetos que Hughes C Sharp em ambientes pouco convencionais. Agora cheguei ao ponto em que gostaria de compartilhar tudo o que é rico com vocês. Fazer cursos online é muito divertido,
e eu realmente gosto de ser um professor virtual. Eu amo a idéia de se conectar com pessoas de todo o mundo, então obrigado novamente por se inscrever neste curso. Vamos começar.
3. O operador coalescing de null: Ok, vamos começar com a nossa lista fora. Recursos de linguagem Cool C Sharp. A primeira característica que eu gostaria de falar é o chamado operador não coalescente neste pequeno operador é realmente útil quando estamos lidando com frio como este. Então eu tenho uma variável de string aqui chamada Nome Eu atribui algum tipo de valente com valioso . Mas se esse valor for realmente não, então eu quero que a variável name mantenha uma string vazia em vez disso. Isso é útil se o cult restante usa a variável name sem verificar se há valores sempre. Para ser justo, não
há nada de errado em verificar se há valores em muitos lugares em seu código. Mas às vezes o número de cheques que você precisa fazer fica fora de controle. Tia Innocently mais conveniente para trabalhar com uma corda vazia em vez disso. Então nós temos este trecho de frio, que tende a aparecer muito em projetos em C afiado. Uma maneira de simplificar os resfriados é usando o turno. Cada operador que você provavelmente já viu este operador muitas vezes come aquele com a pergunta . Trabalhe no cólon. Se eu re fator esses trechos para usar o operador de curtume, obtenho os seguintes resultados. Devo ter escrito frio como este mil vezes em meus projetos. A curva Arriaga aerator retorna o valor ou uma string vazia se o valor não é exatamente o mesmo comportamento que é antes. Mas agora perdemos as declarações S no código de alerta é muito bem na mesma linha, mas você pode simplificar este culto ainda mais. O operador não coalescente tem a verificação nula incorporada para que você possa escrever o código simplesmente assim. Nos bastidores, ainda
é o mesmo casaco o cheque para não. Em seguida, retorne o valor ou uma string vazia. Mas com este operador, posso escrever o código de uma forma super compacta. Então aqui, em uma série de coisas legais que você pode fazer com este operador. Em primeiro lugar, vamos dar uma olhada em tipos notáveis. Posso colocar um trecho de código como este com uma entrevista notável. Então eu tenho uma variável de entrevista conhecida chamada número, que eu disse para saber que isso é perfeitamente válido porque é inteiro incognoscível não pode ser Não , mas agora olhe para a segunda linha lá eu declaro uma entrevista normal disponível, chamado resultados em. Eu atribuo o número a ele. Então, o que acontece? Um inteiro normal não pode conter valores. Então o compilador se recusará a compilar esse culto. Confira isso. Veja, isso não funcionou. Para obter os resfriados compilando, eu preciso fazer com typecast como este. Eu vou re compartimento. Não vejo erros. Então agora eu posso executar o programa. Aqui vamos nós. Você vê, eu recebo uma exceção de operação inválida que faz todo o sentido porque eu estou tentando nenhum valor em um inteiro normal que não é totalmente permitido em c sharp para evitar esses tipos de exceções de tempo de execução. A melhor coisa que você pode fazer é parar de usar o tipo passado nesta situação. Em vez disso, use o operador não coalescente que gosta disso. Então, agora não somos obrigados a frio. Tudo está bem quando eu corro os resfriados. Aqui vamos nós. Veja, eu não recebo uma exceção. Então o que está acontecendo agora é que eu ainda estou colocando a entrevista notável em uma
variável não notável . Mas eu também estou especificando um valor padrão fora de zero no caso do valor crédulo é bem, não, nesta é a principal razão pela qual este operador foi introduzido. O operador não coalescente torna muito fácil a transição entre conhecidos em tipos de
valor não notáveis sem ter que usar confusões, cheques
nulos em todo o seu casaco. Outro caso de uso útil para o operador não coalescente é encadear padrões juntos. Então é assim que funciona. Digamos que estou assinando um parâmetro de configuração como este. Agora imagine que eu estou atribuindo um valor de configuração aqui, então valor representa um valor de configuração em Vamos dizer, há também um padrão local em um padrão global para esses valores. Então eu quero atribuir esse valor. Mas se não for, então eu quero voltar para o padrão local. Se isso for não para, eu quero voltar para o padrão global. Então o culto para fazer isso parece assim para que você possa limpar isso usando operadores de turnos. Mas você tem que aninhar ele assim, então isso é mais compacto, mas não muito legível em. Sim, eu digitei frio como este 1000 vezes em meus projetos para, mas agora assista isso usando o operador sem coalescência. O culto muda para este código fonte super compacto. A Andi. Ainda é completamente legível, uma grande melhoria. Vou mostrar-lhe o que mais aplicação fora do operador não coalescente. Digamos que eu tenha uma propriedade que retorna um construtor de cordas com uma grande capacidade inicial. Quero inicializar o buffer de string nos últimos momentos possíveis. Isso é chamado de carregamento preguiçoso. Tantas enseadas seriam assim. A propriedade retorna. O tampão de pedregulho da Tia Initialize é que está no voo. Se a variável protegida é não, este é clássico casaco de carregamento preguiçoso, algo que você usa muitas vezes em projetos C Curto. Agora vamos simplificar o frio com o operador de coalescência nula. Aqui está como o resultado final se parece. Eu estou correndo um pouco à frente de mim aqui como a coisa à direita fora do operador é uma expressão
declaração em. Nós vamos ver mais desses mais tarde neste curso. Mas por enquanto, confie em mim que este frio ou retorna a variável buffer ou se não for, ele inicializar está disponível em tempo real e, em seguida, retornar a. Então, novamente temos exatamente o mesmo comportamento. Mas o código-fonte é muito mais compacto e mais fácil de ler. Está bem, deixa-me resumir esta palestra. O que aprendemos? O operador convalescente conhecido é escrito em códigos como expressão um e, em seguida, dois interrogação e, em seguida, expressão para o operador retorna, especialmente um exceto quando Expressão um é não. Nesse caso, ele retorna expressão para. Em vez disso, você pode usar o operador para fazer a transição fácil entre tipos de valor novos e não notáveis. Você também pode usar o operador para retornar um sets off sobre valores de configuração montáveis
encadeando mais de um operador juntos em. Finalmente, você pode combinar o operador com uma expressão de declaração para implementar o carregamento lento.
4. typecasts macios: Meu próximo recurso de linguagem legal tem a ver com typecasting. Como eu tenho certeza que você sabe, um typecast converte uma expressão de um certo tipo em outro tipo. Dê uma olhada nos seguintes trechos de código. Eu não tenho objetos matriz preenchido com diferentes tipos de valores. Há datas,valor de
tempo, valor de
tempo, uma corda booleana e um jurado Inter de carros alegóricos em um personagem. Em seguida, há um loop que enumera a matriz nas tentativas de converter cada valor para um fluxo em Exibir-lo no console. Agora não vai surpreendê-lo que este frio vai falhar. Somente os elementos da matriz de Seward contém um fluxo, e o elenco explícito falhará para todos os outros elementos. Vou executar o programa para provar isso. Aqui vamos ver uma exceção de conversão inválida para os primeiros elementos da matriz. Justiça, eu previ. Ok, então agora deixe-me fazer algumas modificações. Eu vou mudar o casaco para isso agora os códigos não vão mais lançar exceções. Eu uso o operador é para testar se o elemento é um fluxo. Se for, eu faço o elenco, que agora sempre terá sucesso em exibir o valor no console. Mas se o elemento não é uma string. Escrevo uma mensagem diferente para o console muito melhor, certo? Mas podemos melhorar ainda mais este culto. A declaração if é um muito detalhado sobre. Podemos re fator isso em uma notação muito mais compactos, assim como fizemos com um operador não coalescente. Dê uma olhada nisso. Você vê muito melhor. Eu usei o como operador para executar um elenco suave. Este é um elenco tipo que vai em frente como normal se os tipos são compatíveis. Mas se o elenco não pode ser executado por qualquer motivo,
em vez disso, em vez disso, fora lançando em exceção de elenco inválido. O operador como simplesmente retorna no on nas instruções de linha direita. Eu uso nossos amigos do que nenhum operador coalescente para qualquer saída do valor do fluxo ou uma mensagem afirmando que o valor não é fluxo. Isso reduz drasticamente o tamanho do Michael,
No entanto, tudo ainda é muito legível. Mas tem uma
coisa . Você tem que ter em mente. A conversão de softs não pode distinguir entre uma conversão com falha ou uma string com o valor desativado. Não. Em ambos os casos, o operador retornará um valor sem. Para distinguir entre esses dois cenários, você precisa verificar explicitamente o valor nulo como este. Então, quais moldes podem ser tão operados? Faça bem. Aqui está um elenco de lista para tipos de referência. Custa dois tipos notáveis lançados a partir de valores de caixa do dedo do pé, mas não castas diferentes do usuário. Então, confira. Tempos notáveis estão na lista. Então, digamos que eu queira modificar os trechos de código anteriores a serem exibidos, todos introduzidos na matriz Objetos. Posso simplesmente modificar as chamadas assim. Ponto mais fácil o como operador agora tenta executar um soft cast toe inteiro incognoscível. Até o elenco tem sucesso. Eu não vou ter inserido o seu valor, mas se ele falhar, Eu vou ter um valor nulo no meu inter experiente. Claro variável nas declarações de linha direita eu contesto para não usar esses mesmos velho conhecido operador
coalescente. Assim como com cordas notar, no entanto, que agora exibo mineiros. Um. Se o elenco falhar porque eu tenho que usar um valor compatível com o tipo de
entrevista notável que eu uso do outro lado do operador de coalescência. Uma coisa importante a lembrar é que o operador formigas não pode executar
conversões definidas pelo usuário . Então, se eu tiver minha própria classe configurada assim, veja aqui você tem uma classe name com uma propriedade string chamada Value com seu próprio getter e setter. E eu também adicionei a moldes implícitos. O 1º 1 converte de String para Name, o que cria um novo nome. Instância ao inicializar. É com um dado fluxo na segunda casta converte de nome para string e simplesmente retorna a propriedade value fora da instância de nome dado. Então, agora o que acha que acontece quando eu correr o seguinte ouro? Eu usei o como operador para lançar o objeto valioso dedo do pé um riacho. A variável contém uma instância off name, que tem um molde definido pelo usuário implícito para converter de nome em string, então tudo deve funcionar bem, certo? Infelizmente, não, deixe-me demonstrar executando o programa. Aqui vamos nós. Veja, eu recebo a mensagem não uma corda. A razão pela qual isso não funciona é porque C Sharp avalia moldes de tipo implícitas durante o tempo de
compilação no como o operador é executado em tempo de execução. Então, para corrigir isso, você pode usar uma variável dinâmica em vez disso porque as variáveis dinâmicas são implicitamente
convertidas em tempo de execução ou você pode voltar a usar um elenco explícito ao fazer a verificação de tipo manualmente, então você tem que ter cuidado com o operador como. Funciona muito bem, mas apenas para tipos de referência. Novos tempos em tipos de valor in a box. Ele não pode lidar com conversões definidas pelo usuário. Ok, deixe-me resumir o que aprendemos nesta palestra. O operador como executa um typecast suave de um tempo para outro. Se a conversão falhar, o operador retornará No. O operador como pode converter um tipo de referência tipos notáveis em tipos de valor in a box. O operador pode ser usado com conversões definidas pelo usuário. Você tem que lançar explicitamente ou usar variáveis dinâmicas.
5. Propriedades Auto: minha próxima linguagem legal Fisher tem a ver com propriedades. Então vamos dar uma olhada em trechos de código típicos que configura uma propriedade em C sharp. Então esta é uma pessoa de chamadas de classe muito simples que contém um único Stringfield privado para manter o nome da pessoa. Eu também declarei uma propriedade pública para obter e definir o nome. Estes são os padrões e fronteira lugar C revestimento afiado que você provavelmente tipos e 1.000.000 vezes em seus projetos em. Isso leva-me ao problema principal. Precisamos digitar esse fragmento de código tantas vezes que é realmente muito trabalho. Não seria muito melhor se pudéssemos comprimir todas estas cartas para quatro linhas? Bem, sem todas as propriedades, isso é realmente possível. Confira isso. Este é exatamente o mesmo código. O compilador C sharp irá compilar este código-fonte em produzir exatamente a mesma coisa. Um campo privado em um getter e setter propriedade pública. Mas agora eu tenho que digitar muito menos código-fonte para obter os mesmos resultados. Então lá vai você para fora. Toda propriedade é uma propriedade onde você simplesmente digitar entrar no set ou logo após a
declaração de propriedade . O componente C sharp irá então criar automaticamente um campos privados para alimentar o culto para o getter e setter para você. Então agora você pode estar se perguntando, por que usar propriedades em tudo? Não é muito mais simples usar um campo e torná-lo público? Nigris ver exatamente o mesmo número de linhas de código fonte, Mas agora eu não preciso complicado compilador magia para criar guetos automaticamente e nos definir para mim. Por que eu precisaria desse recurso? Bem, há razões importantes para usar propriedades em vez de sentimentos públicos. Digamos que você comece introduzindo um campo público em sua classe. Então, algumas semanas depois, você descobre que você precisa carregar preguiçoso esses campos. Então agora você tem que re fator de campos em uma propriedade em colocar os códigos de carregamento preguiçoso no getter. Mas agora você introduziu uma mudança decisiva. A interface fora de sua montagem mudou porque o que era uma vez o campo é agora uma propriedade, qualquer casaco que chama sua biblioteca precisará ser re compilado. Outro problema é que você vai precisar de novos potros para refletir sua montagem. Os campos são acessíveis através da reflexão usando o método get fields Mas para propriedades , você precisará dos métodos gets propriedades. Então, qualquer frio que usa um reflexo como, digamos, códigos de
serialização terá de ser alterado para ter a sua fatoração re em conta. Se você estiver desenvolvendo códigos pegajosos, você descobrirá que a vinculação de dados decorativos só funciona em propriedades em não em campos. Se você começar com um campo e depois descobrir que você precisa de dados do dedo, vincula os campos com o controle de interface do usuário. Então você terá que refletir seus casacos para fazê-lo funcionar. Finalmente, as propriedades podem ser parte de uma interface, mas não é possível. Então, por exemplo, se você precisar adicionar uma propriedade de cor ou um dedo de propriedade de nome na interface, vá em frente. Não há necessidade de configurar manualmente os métodos get on set. Você pode simplesmente não estar na propriedade para a interface diretamente. Faço isto muitas vezes de casaco. É um grande recurso, modo a resumir, propriedades são úteis porque você pode mais tarde adiciona carregamento preguiçoso ou verificação intervalo detém sem re compilar clientes frio. Você pode adicionar carregamento senhora ou retenção de verificação de alcance sem alterar a reflexão. Tribunais. Você só pode dados Bynes contra propriedades e propriedades podem fazer parte de interfaces. Então agora deixe-me mostrar-lhe uma coisa legal que você pode fazer com auto propriedades. Digamos que queremos configurar em objetos imutáveis, objetos imutáveis ou objetos que você configurou no construtor e depois que eles
nunca podem ser alterados. Isso é muito útil em revestimento multi-rosca, onde mais de um segmento pode acessar com segurança os objetos sem ter que se preocupar que os campos podem alterar inesperadamente seu valor. Então, como você configuraria manualmente objetos imutáveis como este? Então eu fiz o campo privado somente leitura, o que significa que só pode ser definido na classe. Construtor. Eu removi o criador de propriedades Andi adicionou um construtor para inicializar o campo. Esta classe só pode ser inicializada com o construtor ligado quando estiver em Stan, ela comeu. Você só pode obter o nome através da propriedade agora. Vou simplificar o frio usando propriedades automáticas. Aqui vamos nós muito mais curto. Não que eu especifique um “getter” público. Centro Privado Andre. Sim, você pode fazer isso. Você pode usar diferentes visibilidades para o getter e setter, Um recurso muito legal. Então agora eu inicializar minha propriedade chamando o centro privado no construtor em Zen no mundo exterior só pode acessar o getter público em não modificar o valor. No entanto, existem dois problemas com este casaco. O compilador cria um suporte normal. Campos para fora, não ler, só se sente como queremos, e o centro é acessível a partir de toda a classe pessoa. Assim, a classe em si pode alterar o valor para que não obtenhamos os benefícios multi-threading. O campo não é lido apenas na classe pessoa pode chamar o centro a qualquer momento e alterar o campo. Uma ameaça não tem garantia de que outra ameaça não alterará inesperadamente o valor
do campo de nome. Microsoft percebeu que este é o problema e então eles introduziram um recurso muito agradável em Seashore Up seis. Agora você pode simplesmente fazer isso. Você notou a mudança? O setor privado se foi. O compilador é inteligente o suficiente para perceber que é uma leitura. Somente propriedade pode ser apoiado com o campo privado só leituras como para inicializar a propriedade . O compilador permite que eu me refira ao centro no construtor novamente. O compilador é inteligente e ele irá refratar automaticamente meu código para se referir aos campos privados somente
leitura em vez disso. Neste realmente cria um objeto imutável com um campo de suporte somente leitura que absolutamente nenhum setter
propriedade na classe. Essa classe agora pode ser usada com segurança por mais de uma ameaça sem precisar de nenhum thread procurando sincronização. Ok, deixe-me resumir o que temos Lawrence nesta palestra até que as propriedades são um recurso onde o compilador C sharp cria automaticamente o getter e setter frio nos campos de apoio . Decoração você direita fora das propriedades, seguindo a declaração de propriedade com Obter esse conjunto sem especificar a sua implementação. Fora de propriedades são úteis porque eles permitem mudanças futuras para getter e setter coat sem quebrar a interface de montagem ou exigir mudanças para ouro reflexo. Você também pode dados bytes duas propriedades e colocá-los em interfaces. Você pode deixar de fora o centro para criar uma classe imutável com um campo de suporte somente leitura em nenhum centro.
6. Três métodos de cadeia úteis: a classe string tem alguns métodos auxiliares muito úteis que muitas vezes são ignorados
usando-os . Você pode evitar que suas cartas fiquem desnecessariamente inchadas. Dê uma olhada no seguinte trecho de código. Estou escrevendo um método para montar um nome completo de um primeiro nome sob o sobrenome. Este frio está perfeitamente bom. Não há nada de errado com ele, mas há uma maneira mais compacta de executar a verificação de string no ou vazio. Deixe-me modificar o frio e mostrar-lhe células de frango, então este é exatamente o mesmo código. O método é não ou vazio faz as mesmas verificações nos bastidores. Os únicos benefícios de usar essa mensagem é que ela é menor para contas, então há menos chance de um erro de digitação, por exemplo, digitar em vez de ou não eram iguais em vez de iguais. Ok, então isso é um pequeno benefício. Mas vamos seguir em frente. Há um problema com o frio dele que é, que o primeiro nome só pode conter espaços. A faixa não ou vazia não vai descontar. Isso está ligado. Portanto, eu vou obter um nome completo consistindo em um monte de espaço é seguido pelo sobrenome para verificar contra esta condição. Preciso mudar o frio da seguinte forma. Você provavelmente já viu esses resfriados muitas vezes em seus projetos e arroz. A maneira padrão de verificar contra uma string de espaço em branco é aparar sua on, em
seguida, verificar se ficamos com zero string. Mas esta solução tem uma grande desvantagem. Strings estão em variantes, então toda vez que a mensagem de corte
é chamada, ele vai toe aloca uma nova string no heap. Se o método recebe nome completo está em uma seção crítica de revestimento que está sendo chamado milhões de vezes por segundos, então esta solução vai colocar um monte de pressão sobre o coletor de lixo, inundando o calor com cordas. Agora considere a seguinte mudança que eu substituí a expressão if por um cool dois é não ou espaço em branco. Então, novamente, o código é menos detalhado, que reduz a chance de fazer um erro de digitação. Mas agora também tenho outra vantagem. A senhorita. Ele não alocar fluxos temporários no heap, isso é tudo. Em vez
disso, ele simplesmente verifica o fluxo em verificações se ele contém apenas caracteres de espaços em branco. Então agora o frio é realmente mais eficiente. Ele executa as mesmas verificações de antes, mas evita alocar uma string no cada vez que é chamado muito melhor. Ok, então agora eu tenho meu nome completo que eu quero compará-lo com nome desconhecido, por exemplo, o meu próprio. Então eu teria o seguinte culto. Infelizmente, isso não funcionará se as variáveis de nome e sobrenome usarem a caixa de diferença, por exemplo, se estiverem todas em maiúsculas. O que eu realmente preciso fazer aqui é realizada uma comparação de cadeia insensível maiúsculas e minúsculas, então você costuma ver frio como este. Infelizmente, este frio tem a mesma desvantagem que usar esses métodos de treinamento para verificar se há apenas uma string de espaço em
branco. Os dois métodos superiores cria uma nova cadeia de caracteres no heap toda vez que ele é chamado em seções
críticas, isso irá inundar o com muitas auditorias de cadeia de caracteres de curta duração, D referenciado. Isso vai colocar um monte de pressão indesejada sobre o coletor de lixo, mas nós realmente queremos fazer aqui é simplesmente comparar as duas cordas caractere por caractere sem fazer qualquer distinção entre minúsculas e maiúsculas. E adivinha? Há métodos para isso. Então agora meus cones executa uma comparação de cadeia de caracteres sem distinção de maiúsculas e minúsculas sem criar novas cadeias no heap muito melhor. Ok, deixe-me resumir o que aprendemos nesta palestra. O é mellower anti métodos verificações. Se as strings não tiverem comprimento ou zero, elas não terão benefícios de desempenho sobre os botões de verificação manual. Usando os métodos precisa ainda mais compactos frio. O não é mais métodos de espaço em branco verifica se as cadeias de caracteres são Não. Zero ling ou contêm apenas caracteres de espaço em branco. A mensagem é mais rápido do que a solução usual fora usando guarnição porque ele não alocar uma nova tensão sobre o ele. O ponto de string é igual a métodos podem antes de uma comparação de cadeia de caracteres sem distinção entre maiúsculas O método é mais rápido do que a solução usual usando para cima ou para baixo porque ele
não alocar uma nova string no
7. A declaração usando: nesta palestra, eu vou mostrar a vocês como lidar com o recurso descartável está em C afiado. Dê uma olhada nos seguintes trechos de código. Então esta é uma maneira bastante padrão de descriptografar texto em C afiado. Eu começo com um arquivo criptografado, alimentar seu conteúdo em uma cripta de fluxo emparelhado com um er descriptografar que eu disse anteriormente para descriptografar o texto em. Finalmente, eu crio um líder de fluxo para ler o conteúdo fora da cripta, um fluxo no retorno. Os resultados descriptografados. Então, sempre que estiver no programa, você pode ver que ele exibe texto não criptografado no console. Mas este código não é muito robusto. O fluxo de arquivos no script, um fluxo configurado em buffers de memória para descontar seus dados e esses buffers permanecem no lugar até os fluxos sejam coletados lixo, que pode acontecer minutos ou mesmo horas depois. Então o casaco está sendo desperdiçado com a memória. Para consertar isso, preciso me livrar dos buffers assim que terminar de descriptografar o texto. Como você deve saber, a mensagem para descartar recursos do sistema é chamada bem descartado, então eu vou modificar meu código da seguinte maneira. Mas agora eu tenho outro problema os fluxos não serão descartados se por algum motivo, as primeiras 5 linhas de Cold Shadow em exceção. Então eu tenho que me proteger contra o cenário. Preciso embrulhar os códigos com “Try catch box “como esta. Então você vê que Deus é muito detalhado, muito rápido. O código agora está devidamente protegido contra exceções, mas também é uma grande confusão fora manipuladores de exceção aninhados em declarações descartar. A legibilidade deste código desceu. Agora o problema é, devemos mesmo esfriar assim? Porque a única maneira segura de garantir que um dispor será chamado é usando um
bloco finalmente . Então, se você ficar cansado em decide pular um par de centenas de exceção para economizar tempo, você está se configurando para algumas sessões de debate realmente irritantes no futuro. Felizmente, a
Microsoft reconheceu esse dilema. Tias nos fornece o extremamente útil usando declarações. Você provavelmente já está familiarizado com as instruções de uso como um meio para importar
espaços de nome . Mas há outro uso. Vou trocar o casaco. Agora veja isso. Este é exatamente o mesmo código que o compilador usa. Estes usando instruções em expande-os em caçadores de exceção completa soprado com uma chamada para o método
dispor em cada bloco finalmente. Então você vê, há absolutamente nenhuma desculpa para evitar chamar o método descartar. Microsoft tornou extremamente fácil para Fuller o para seguir o procedimento adequado,
dando-nos as instruções de uso na metade do compilador criar automaticamente os
fragmentos frios completos para nós. Então, para resumir, sempre ,
sempre, sempre use a instrução using se você estiver alocando algum tipo de recurso escasso e você quiser descartar o recurso quando estiver pronto, exemplos de escassos é o nosso em buffers de memória. Como no meu exemplo, arquivo lida com conexões de banco de dados como identificadores de dispositivo gráfico. Ok, na segunda parte desta palestra, vou mostrar-lhe algumas coisas legais que você pode fazer com as declarações de uso que você viu que as declarações de
uso é extremamente útil na configuração dos modelos co adequados para descartar. O recurso é rápido, mas uma desvantagem é que quando você coloca religiosamente usando declarações em todo o seu culto, você vai ficar muito profundamente aninhado frio. Veja a versão final do meu casaco. Atiradores. Só estou lendo um arquivo antigo. Escrevê-lo no meu resfriado já está aninhado com três níveis de profundidade. Imagine como seria o código. Se eu me salvasse. Eles poderiam descriptografar. Arquivado de volta ao disco, eu teria aninhado frio seis ou sete pouco vapor. Agora, do ponto de vista da performance, há absolutamente nada de errado com o casaco profundamente aninhado. Mas para programadores americanos, é um pouco irritante. São movimentos frios até os direitos na tela? Fora dos braços do editor. Um grande número de chaves encaracoladas torna o frio difícil de ler. Mas novamente, a
Microsoft vem em nosso resgate para evitar ter profundamente aninhado usando instruções. Estragam o nosso casaco. Na verdade, eles recomendam a seguinte diretriz de formatação fria. Agora veja isso. Então este ainda é o mesmo casaco. Mas o mais externo para usar declarações não têm chaves, e eu não estou mais em amassar as declarações com Tubbs. Microsoft realmente aprova fora este estilo de codificação no código de estúdio visual para Motor irá reconhecer o estilo e ferramentas como estilo Cop não irá produzir avisos ou erros. Se o carvão parece um pouco estranho para você, pense sobre isso como se as instruções de uso são uma lista fora declarações de variáveis. Você colocaria declarações variáveis no topo de seus resfriados em uma lista sem identificação plana neste estilo segue a mesma convenção. Eu pessoalmente gosto deste estilo de código, mas há outros profissionais da I T lá fora que não gostam. É por causa do uso de declarações. Configura um bloco frio em blocos de código deve sempre ter chaves em Ser provavelmente recuado , então use este estilo a seu critério. Uma coisa legal que você pode fazer com o uso de instruções é configurar mais de uma declaração em uma única instrução. Tudo que você precisa fazer é colocar todas as declarações em uma única instrução usando separados por
vírgulas . Mas há uma limitação muito importante. Todas as declarações precisam ser do mesmo tipo. Agora, olhando para minhas chamadas de descriptografia, isso vai ser um problema. Eu tenho um fluxo de arquivos, um fluxo de criptografia em um líder de fluxo. Estes são todos tipos diferentes. Então, como posso combiná-los em uma única instrução usando? Bem, aqui está um pequeno truque que você pode usar. Há realmente um único denominador comum entre todos esses tipos, e é que eles são todos descartáveis e cada tipo descartável em ponto Net tem que
implementar a interface descartável I. Então esta interface é o denominador comum. Então tudo o que eu preciso fazer é configurar três I declarações descartáveis como este, você percebe que eu preciso colocar no texto moldes bem com a palavra-chave como, porque todas as minhas variáveis estão agora fora do meu tipo descartável. Então eu preciso lançá-los de volta para o tipo correto sempre que eu quiser usá-los. Agora. Pessoalmente, não
acho esse gatilho útil. Você ainda tem o mesmo número de linhas covardes. E agora o código também está cheio de marés para converter as variáveis descartáveis de volta para o tipo correto. Isso realmente não melhora a legibilidade fora do frio em tudo. Ok, eu vou concluir esta palestra com dois erros comuns que muitas vezes são cometidos com a
declaração de uso . Vou começar com este casaco. Não. O que você acha? Então, esta é novamente a lista sem identificação plana fora usando instruções. Mas agora eu puxei as declarações de variáveis fora da instrução de uso. As declarações vão no topo das instruções usando simplesmente inicializar as
variáveis pré-existentes . Parece OK, não é? Então, o que há de errado com o casaco dele? Bem, o problema é que agora posso acessar as variáveis depois que elas foram descartadas. As declarações de variáveis estão fora do bloco de uso, então eles permanecem no escopo para a duração fora de todo o programa. Então eu posso realmente fazer algo assim. Estou acessando o fluxo de arquivos depois que ele já foi descartado. Isto é obviamente errado. Eu nunca deveria tentar acessar variáveis descartadas. Mas veja o que acontece quando eu obrigo o código. Não recebo erros de compilação porque não estou fazendo nada enviado taticamente incorreto. Estou simplesmente acessando uma variável que ainda está no escopo. Mas agora olha o que acontece quando eu corro o frio. Recebo a EDL que você estava esperando. Não posso chamar nenhum método em um objeto descartado. Então esta convenção de codificação realmente me permite acessar variáveis descartadas e acionar erros de
tempo de execução. Agora, isso é um problema. Mas veja o que acontece quando eu mudei os códigos de volta para o seu formulário original em, em
seguida, ainda tentar acessar o fluxo sujo depois que ele foi descartado. Agora veja o que acontece quando eu compilo essas chamadas. Você vê que o compilador me diz que eu estou acessando em fora da variável de escopo A
instrução using configura bloco de escopo em quaisquer variáveis declaradas dentro das instruções de uso são inacessíveis após o fim fora do escopo. Olha, isso torna completamente impossível para mim acessar as variáveis depois que elas foram descartadas. Portanto, nunca coloque as declarações de variáveis fora das instruções de uso porque você está configurando para possíveis erros de tempo de execução quando você acidentalmente tentar o acesso. Objeto indisposto. Deixe o compartimento protegê-lo. O erro comum segundos que vejo com uma instrução usando é chamado Like this. Esses códigos configura uma solicitação da Web para acessar a página da Web na Internet em. Em seguida, ele usa o Stream Reader para ler a resposta da Web e para baixo da página em uma
variável de cadeia de caracteres. Qual é o problema com o casaco dele? Bem, vez que há apenas uma única instrução usando, apenas uma única variável será descartada, que neste caso, é o leitor de fluxo. Agora, a boa notícia é que o leitor de fluxo também irá descartar automaticamente o fluxo de
resposta subjacente . Mas isso ainda me deixa com o objeto de resposta http. Este objeto também deve ser descartado o mais rápido possível porque ele mantém no dedo do pé no soquete
de rede. Então o código correto seria algo assim. Então, agora eu tenho que usar instruções um para descartar o objeto de resposta http em um para descartar o líder de fluxo, que deve que também irá descartar automaticamente o fluxo de resposta. Então você vê que empacotar muitos objetos inicialização em um único usando instruções é possível. Mas você tem que estar muito vigilante que a única chamada para descartar irá limpar todos os outros objetos para ele é muito fácil de ignorar acidentalmente um objeto e tê-lo perdurando em torno após o dispor Para salvar-se de ter que ser hipervigilante todos o tempo. É muito melhor apenas dividir a inicialização em várias instruções usando e usar um único usando instruções para cada objeto. Assim, nada pode dar errado. E se todos os seus objetos se separarem ao mesmo tempo, sinta-se livre para usar a vírgula separada nos enviou. Certo, aqui está um resumo. Tudo recuperado nesta palestra. O uso de instruções configura uma tentativa finalmente bloco toe descartar automaticamente de variável. Uma vez que você é feito com ele, você pode aninhar usando declarações, deixar fora das chaves mais externas em, não em dente suas brasas para melhorar a legibilidade esta sintaxe casaco é aprovado pela Microsoft. Você pode ter um único usando instruções configurar mais de uma variável separando as declarações com comércio, mas somente se todas as variáveis estiverem fora do mesmo tipo. Declarar variáveis fora de suas instruções de uso é uma má idéia porque estende seu escopo. Isso permite que você acesse as variáveis depois que elas já estão descartadas. Inicialização de objeto aninhado em um único usando instruções é uma má idéia porque os outros objetos podem não ser descartados automaticamente.
8. Iniciantes de objeto e coleção: as próximas escolas ele característica linguagem afiada Eu gostaria de mostrar-lhe é o objeto na coleção inicializar er. Esse recurso torna muito fácil configurar um gráfico de objetos complexo com apenas algumas linhas de código. Dê uma olhada no seguinte trecho de código. Você vai notar as propriedades auto na definição Fora da classe de pontos, Eu estou configurando uma classe simples com duas propriedades de entrevistador público, X e Y. Então, na mensagem principal do programa, eu declaro um variável fora do tipo pontos em um sinal valores para as propriedades X e Y. É bem simples até agora, não acha? Apenas um pouco simples de resfriados para declarar no tipo de desafio do usuário inicializado. Mas sabias que podes reflectir sobre este casaco? Remova duas linhas de código-fonte. Deixa-me mostrar-te. Então agora eu Em vez disso, ela comeu a variável ponto chamando o construtor. Mas então eu continuo a linha com uma chave de abertura encaracolado. Uma lista fora de expressões de inicialização de propriedade separadas por vírgulas. Andi, termino a linha com uma chave de fecho. Esta sintaxe é chamada em objetos inicializar er então esta é uma sintaxe muito legal. Você pode seguir qualquer chamada de construtor com uma lista fora de campos públicos ou expressões de
inicialização de propriedade . Neste caso, Yates. Tia Initialize é uma classe em apenas uma única linha de código para compactar a fonte fria
ainda mais. Você pode opcionalmente riff remover o parêntese vazio está seguindo o construtor assim . Muito legal, não acha? Nos bastidores, a compilação nítida C simplesmente leva o objeto. Initialize er produz instruções de inicialização de propriedade da tia campo para inicializar os objetos. Então, novamente, este recurso não é mais do que açúcar sintático para ajudá-lo a frio, mais rápido ou verificado. Inicializar er em tipos anônimos são muito semelhantes para inicializar um tipo anônimo. Você usaria exatamente a mesma sintaxe como com o objeto inicializar er, mas você deixa de fora o nome do construtor, então minha estação instantânea ponto seria assim. Eu removi o ponto de palavras. Então, agora a variável conterá no tipo anônimo com propriedades públicas X e Y. Observe que eu também tenho que usar a palavra-chave var porque eu não sei mais qual o tipo fora da variável será. Objetos inicializam. Er é realmente brilhar quando você está configurando listas de objetos. Então vamos dizer que eu quero inicializar uma lista fora do ponto instâncias, eu poderia fazê-lo assim. Então agora eu estou usando a sintaxe de inicialização com os elementos de lista separados por comércio. Isso é chamado de inicialização de coleção. Er. O compilador C nítido levará o casaco fonte em produzir chamadas para a mensagem do anúncio fora da lista para cada Elementos lista. Observe que estou aninhando objeto inicializar er dentro de uma coleção inicializar er, então cada elementos da lista Aqui é uma instância de ponto totalmente inicializado, com você compilador novamente produzindo as instruções de atribuição de propriedade necessárias para corretamente inicializou cada ponto. Outro truque legal que você pode usar com coleção inicializar Er é chamado de um
construtor não padrão em inicializado a lista apenas um ir. Por exemplo, digamos que eu queira inicializar minha lista fora de pontos para uma capacidade fora de 200 elementos. Eu posso simplesmente fazer isso assim. Então agora eu estou chamando o construtor de lista não padrão que me permite especificar uma
capacidade de lista em. Então eu simplesmente continuar a linha com a coleção inicializada por cento ups. O compilador irá converter este revestimento em um construtor. Chame quatro chamadas para a mensagem de anúncio para inicializar os elementos fora da lista. Outra coisa legal que você pode fazer com a coleção. Inicializar er é configurar um dicionário. Digamos que eu queira configurar um dicionário que mapeie códigos de cor RGB para seus
nomes correspondentes . Eu posso simplesmente fazer isso novamente eu estou usando a coleção initialize er sintaxe. Mas agora cada elemento está contido em chaves e contém um par de valores de chave. O compilador irá gerar três chamadas para os métodos de anúncio fora do dicionário em alimentar o par de
valor de chave para o método, Supondo que o primeiro parâmetro de método é a chave no método segundos, parâmetro é o valor. Você também pode usar o índice ou sintaxe toe inicializar o dicionário assim. A coisa boa sobre Initialize Ear é que eles não estão limitados a essas classes de
coleta padrões . Tudo o que eles exigem é em I interface memorável em um público adiciona método com os
parâmetros de método que muito as expressões de inicialização que você fornece para que você possa usar a coleção, inicializar ou sintaxe em qualquer classe que você gosta. A sintaxe de inicialização do indexador funcionará em qualquer classe com uma interface não memorável olho no indexador com um parâmetro que corresponde às expressões que você fornece para que novamente você
não esteja limitado às classes de dicionário padrão. Ok, deixe-me resumir o que aprendemos nesta palestra objetos inicializar er permitem que você rapidamente em Stan. Ela comeu fora inicializar e objetos coleção inicializar er permitir que você rapidamente em Stan . Ela comeu a colecção inicializada da tia. Inicializar er são apenas açúcar sintático. Nos bastidores, o compilador C Sharp produz instruções para chamar o construtor inicializar campos de objeto e propriedades. A tia ligou para os métodos publicitários para sentir a coleção de coleções inicializar. O trabalho de Er em qualquer classe que implementa a interface inumerável I e fornece uma resposta mexe com os parâmetros corretos. O índice ou sintaxe, funciona em qualquer classe que implementa a interface inumerável em fornece um indexador com os parâmetros corretos.
9. Expressões de consulta LINQ: nesta palestra, vou mostrar-lhe como usar o link claramente expressões em seu C afiado link frio significa linguagem. Integrated Query on É uma tecnologia bastante baseada que foi introduzida na versão C Sharp 3.5. Ele permite que você filtre projetos, junte coleções de grupo em ordem de uma maneira muito natural. Então vamos dar uma olhada. Confira o seguinte trecho de código. Agora vamos dizer que eu quero converter todos os nomes, começando com a letra B para maiúsculas. A maneira clássica de fazer isso é a seguinte. Agora tenho uma lista com três nomes Billy, Bob e Brad, todos em maiúsculas. Mas esta abordagem não é muito eficiente. Esses três nomes estão chegando em uma nova lista genérica, então agora os três nomes são armazenados na memória duas vezes uma vez em seus formatos originais no array
em Once em maiúsculas na lista. No meu exemplo, isso não é um problema, mas imagine se você tem milhões de itens para processar. Uma abordagem muito melhor seria criar um personalizado e numerador que em opera cada nome em automaticamente ignora qualquer nome que não começa com um B. Andi retorna cada nome correspondente em maiúsculas. Com essa abordagem, nenhuma memória adicional é necessária. Você pode imaginar essa abordagem como escrever um personalizado para cada instrução que executa essa filtragem e processamento em segundo plano automaticamente. No C Sharp Division 3.5, Microsoft introduziu Link uma biblioteca de criação muito poderosa que pode facilmente executar essas tarefas. Então agora eu posso reembolsar a minha costa da seguinte forma. Muito mais simples. Estou usando a extensão de desgaste confunde o espaço de nomes de modelagem do sistema para filtrar a matriz no método de seleção para projetar cada elemento em maiúsculas. O resultado final é um personalizado em admiração que filtra todos os nomes, não começando com a letra B em retornos, cada nome correspondente em maiúsculas o tipo fora do valor de retorno é um fluxo genérico I inumerável fora do tipo. Tia, já não
preciso de uma lista genética para guardar os resultados, mas posso melhorar ainda mais este frio. Em vez de chamar a extensão de link. Sra. Eu também pode usar um link rapidamente Expressão? Deixa-me mostrar-te. Este é exatamente o mesmo casaco. O compilador C sharp levará essa expressão claramente em, convertido para as chamadas de método de extensão de link aninhado para implementar a consulta. Mas agora o código-fonte é muito mais limpo sem todos aqueles parênteses está em
expressões de Londres . Quando eu li este frio, você vê os mesmos resultados, Billy ambos em pirralhos. Em maiúsculas, você pode combinar expressões de consulta com chamadas de método de extensão regular. Por exemplo, as chamadas a seguir verificam se há pelo menos um nome, começando com a letra B na matriz. Então aqui estou eu, usando um dedo de expressão de consulta, filtrar o terreno para apenas nomes que começam com a letra B. Eu cerquei essa expressão com um par de parênteses ligado. Então eu chamo os quaisquer métodos de extensão que verifica se a enumeração contém pelo menos um elemento. Quando eu executar este programa agora você pode ver que há de fato pelo menos um nome no
você é A que começa com a letra B. Esta combinação de uma expressão clara na chamada método de extensão funciona perfeitamente bem em. Você pode misturar e combiná-los à vontade. Agora veja isso. Eu também pode agrupar valores os seguintes grupos de expressão nomes por sua primeira letra. Isso retornará em admiração fora dos pares de valor de chave onde a chave é a primeira letra desativada . O nome no valor é uma aeração em casa fora de todos os nomes que começam com essa letra. Quando eu leio este frio, você pode ver que eu tenho três nomes começando com B dois nomes, começando com D, M ou T em um nome, começando com E H I V ou W. Eu também posso ordenar valores na criação de expressões. Por exemplo, deixe-me mudar o casaco para criar I uma lista descendente de grupos contendo os nomes em ordem
decrescente. Esta expressão claramente tem de ordenar declarações. O 1º 1 ordena a lista de nomes em ordem decrescente nas segundas instruções ordena os grupos por chave em ordem decrescente. O resultado é a mesma lista de nomes de grupos que o exemplo anterior. Mas agora, ambos em nomes dos grupos estarão em ordem decrescente. A coisa boa sobre o link claramente sintaxe é que você pode facilmente expressar consultas muito complicadas. A sintaxe realmente brilha quando você está fazendo juntas ou quando você está usando vários geradores ou se você precisa armazenar variáveis temporárias ao avaliar a criação. Então eu vou começar por mostrar-lhe uma declaração conjunta, eu vou juntar-me a lista de nomes com ele próprio. Então vou selecionar cada nome que começa com a mesma letra que outro nome termina com o criativo parece assim. Então, este Cleary de aparência enganosamente simples junta a matriz de nomes com ele mesmo. Selecione os nomes de cada par fora em que a primeira letra de um nome corresponde à última letra outro nome. E então é um projeto novo em admiração em classes anônimas contendo esses fósforos. Você poderia expressar essa consulta com a sintaxe do método de extensão de link regular, mas você teria que usar a seleção de muitos métodos para implementar a junção. Isso tornaria a causa de origem menos legível e clara. Deixe-me correr o frio e lá vai você. Estes eram pares de
nomes mais velhos . Então aqui está outro exemplo. Vou usar uma expressão de link com mais de um gerador para criar uma lista de todas as vogais em cada nome. Esta consulta usa dois geradores, os nomes, matriz e a matriz de caracteres de famílias. A criação opera cada nome, em
seguida, na Emirates, cada vogal em testes. Se a vogal a cura no nome de cada correspondência, a criação retorna um fluxo especificando qual vogal foi encontrada em qual nome. Deixe-me fazer o frio mais tarde, os resultados. Agora outra vez. Você poderia escrever isso claramente com a sintaxe do método de extensão de link irregular, mas isso faria a fonte fria, menos fácil de ler. Finalmente, deixe-me mostrar-lhe um exemplo fora das expressões de consulta de palavras-chave Let's. Vou escrever uma consulta que testa se um nome é um palíndromo. Isso usa claramente as palavras-chave let's para declarar uma variável temporária dentro da
expressão criativa para cada nome na matriz de nomes. Eu usei os métodos inversos para criar uma string com todos os caracteres fora do nome ao contrário. Em seguida, nas peças de desgaste fora da consulta, eu posso simplesmente testar se o nome corresponde à versão inversa fora desse mesmo nome. Quando eu executar esta consulta, veja, você pode ver que Bob na Hanna estão batendo bateria. Ok, deixe-me resumir o que aprendemos nesta palestra. Expressões de link podem ser criadas tanto chamando manualmente métodos de extensão de link ou
escrevendo a criação como uma expressão de consulta na metade do compilador gerar a extensão nítida
C correspondente , deixe-o chamar, criação de expressões no método de extensão As chamadas podem ser livremente misturadas e combinadas com a expressão criativa. Sintaxe é muito adequado para juntas, vários geradores em consultas que declaram variáveis temporárias.
10. A declaração de retorno de rendimento: Na palestra anterior, eu mostrei um monte de link legal claramente expressões, cada expressão operada em uma lista de nomes implementados como uma matriz de strings. Você aprendeu como é fácil usar link para filtrar, classificar grupo e juntar dados em uma matriz. Mas e se não houver nenhum array para criar? E se você precisa claramente uma seqüência dinâmica fora de valores, por exemplo, em infinito, uma gama de inter jours? Pode-se dizer que é fácil. Vou usar os métodos de alcance como este. Então isso claramente retorna em admiração fora de todos os números pares menores que 100. Mas e se você precisar de uma sequência mais complexa? Que tal uma lista de todos os números de Fibonacci? A sequência de Fibonacci é uma sequência de números em que cada número é a soma dos dois números
anteriores. Como você criaria tal sequência? Agora? Uma solução é calcular todos os números em transe e colocá-los na matriz. Mas esta é uma solução desperdiçada porque requer muita memória para armazenar os números. A melhor solução é criar um operador personalizado. Este é um objeto que se comporta exatamente como uma coleção, mas é calcula cada valor
na mosca quando u. n m. Avalie os elementos comigo para cada declaração, escrever um costume no operador não é Difícil. Aqui está o numerador para calcular a sequência de Fibonacci para números de até 100 este numerador produz uma sequência de Fibonacci para números abaixo de 100. O mel se comporta exatamente como se fosse uma coleção. Você pode usar um fore cada loop para inaugurar cada valor como este. Este culto vai escrever cada número Fibonacci até 100 no console. Como você pode ver quando eu executar o programa, as declarações de retorno de rendimento torna muito fácil para escrever personalizado em operadores como minha classe de sequência
Fibonacci. Deixe-me mostrar-lhe que eu vou re fator do potro para usar a declaração de retorno rendimento em vez. Aqui vamos ver muito mais limpo e mais curto. Agora já não tenho aula, mas tenho uma mensagem. Em vez disso, a mensagem retorna em I em sequência memorável de inteiros. Não há nenhuma propriedade atual ou mover em seguida em métodos de redefinição. Em vez disso, o casaco simplesmente usa um loop selvagem para calcular os números naturais fracos em usos. Os rendimentos especiais de instruções de retorno para retornar cada número na sequência. Este método produz a mesma enumeração exata de inteiros. Então, novamente eu posso usá-lo para cada declaração como esta. Então provamos que nada mudou. Estou executando o programa agora. Veja exatamente a mesma sequência de inteiros. Quando eu compilei este culto, o compilador C afiada vai levá-los métodos e fator re. Ele está transformando completamente em um costume na classe operador. A expressão de retorno de rendimento é colocada na propriedade atual nas linhas restantes de código. No loop while são movidos para o movimento. Próximo método, a expressão de loop selvagem entra em um instruções de retorno no final do próximo método move no próprio loop selvagem é completamente removido. Esta é uma mudança significativa. O compilador basicamente rasga Michael partir em, em
seguida, remonta-lo em uma espécie de máquina de estado com uma propriedade correntes no
método move next . Então agora não há mais uma correspondência 1 para 1 entre meus códigos-fonte no
frio compilado . Mas a grande vantagem é que agora eu posso criar personalizado em operadores com apenas algumas linhas de código. As regras para criar enumeradores personalizados com rendimentos retornam. Eu sou muito simples. Tudo o que você retornar com a instrução yield return vai para a máquina de estado, e o compilador irá garantir que a classe geradores retorna esses valores na
ordem correta . A enumeração pára quando você método termina ou quando você executa os rendimentos especiais. Quebrar declarações. Então, quando você coloca uma instrução yield return insider para cada loop while, o compilador muda seu casaco em uma máquina de estado que executa uma única iteração de loop cada vez você chamar. Mova-se próximo. Isso é muito bom porque isso significa que você iria retornar loop on. Lee é executado quando os valores são realmente necessários. E não antes. Deixe-me resumir o que aprendemos nesta palestra. Você pode usar operadores personalizados para criar sequências dinâmicas ou valores que se comportam exatamente como uma coleção. A vantagem muitas vezes no operador, é que ele executa somente quando os valores são realmente necessários. A instrução yield return torna muito fácil criar um personalizado no numerador. A C afiada compilador re fatores loops com declarações de retorno rendimento. Máquina de propriedade lápis que executa uma iteração de loop cada vez que o método move próximo é chamado. A enumeração pára quando o loop de retorno de rendimentos termina ou quando você executa as
instruçõesde quebra de rendimentos instruções
11. Métodos de extensão: nesta palestra, eu vou mostrar a vocês um recurso de linguagem nítida C muito útil chamado Métodos de Extensão. Então, digamos metade do código a seguir. Essas chamadas frias e mensagens chamadas obter alguns objetos que retorna algum tipo de valor. Não sabemos o que é. A segunda linha chama o método de duas strings que é incorporado na classe de objeto duas impressões , a representação de string fora dos objetos para o console. Deixe-me executar o programa. Você pode ver que os objetos são realmente um engenheiro. Está tudo bem e bom. Mas e se eu quiser escrever a representação X e l fora do objeto para o console? Eu posso fazer isso manualmente com um XML serialize er, mas isso é muito frio. Não seria mais simples se eu pudesse simplesmente fazer isso? Infelizmente, isso não será compilado. Deixa-me mostrar-te. Veja, eu tenho que compilar mais tarde. A razão pela qual eu recebo o erro é porque a classe Objetos não tem um embutido para
métodos XML , então este cartão nunca funcionará. Também não há nenhuma maneira que eu possa estender a classe de objeto e adicionar esse método em. Então acho que nunca poderei usar essa sintaxe em particular? Ou posso? Em uma reviravolta surpreendente, a
Microsoft realmente permite que você faça isso e use essa sintaxe. Tudo o que precisamos fazer é criar uma extensão. Métodos como este aviso que este método é estático em que ele tem a palavra-chave this prosseguir o primeiro parâmetro método Agora para usar esses métodos em que eu preciso fazer é chamar os métodos como este. Deixe-me dirigir a costa para provar que está funcionando. Aqui vamos nós. Veja, funciona. O inteiro agora é expresso como XML. Se você nunca viu métodos de extensão em ação, você pode estar piscando agora e pensando que diabos acabou de acontecer? Bem, aqui está a coisa na mensagem de extensão é apenas açúcar sintático. Assim como muitos outros recursos de linguagem que vimos até agora o compilador leva, minha fonte vai em refletores. É assim. Vejo que o cartão acabou de virar a linha certa. Métodos chama diretamente o estático para métodos XML que recebe o objeto como um parâmetro. Agora, contrasta isso com meus códigos-fonte originais, que sugere que eu estou chamando os dois métodos de instância xml no objeto. Instância o compilador está executando um trenó de mão aqui para fazer um método estático parecer uma instância? Métodos. Então, por que você iria querer isso? Bem, maior parte do link é implementado como métodos de extensão que opera na
interface i memorável . Então, quando você está chamando o where ordenado por on select métodos em uma organização, qual lista genérica, você está realmente apenas aninhando um monte de métodos estáticos que recebem os dados não memoráveis como um parâmetro. Este truque permite que a Microsoft implemente Link como um AP I fluente, apesar do fato de que eles não poderiam estender a interface honrosa de ferro de forma alguma. Então, nossos métodos de extensão são uma coisa boa. Você vai encontrar desenvolvedores que pensam que eles são grandes e outros desenvolvedores que acreditam que métodos
de extensão são pura maldade. A controvérsia surge do fato de que esses métodos fingem ser algo que não
são. Os métodos de extensão de uso excessivo podem tornar o seu frio menos legível em um bastão de confusão. Oito. Sua plataforma subjacente. Isso também poluirá a inteligência do estúdio visual, pop-up e torná-lo mais difícil de escrever afirmação fria Problema com métodos de extensão é que eles podem levar a arquiteturas de aplicativos ruins se você precisar de acesso comum a um método que
não é na classe base, então sua hierarquia de classes provavelmente precisa de algum redesenho, mas você pode evitar completamente isso simplesmente adicionando um método de extensão. Então, neste cenário, métodos de
extensão se tornam uma espécie de banda AIDS para manter um design de classe defeituoso funcionando sem ter que dolorosamente redesenhar tudo. Então, na minha opinião, os métodos de
extensão são uma boa cena, mas apenas quando usados com moderação. Você só deve usar métodos de extensão quando você não pode estender a classe por causa desses selos ou você não possui o frio. Quando você deseja adicionar funcionalidade a um tipo global como objetos ou Ryan honrado ou quando você deseja encadear mensagens em um A P I. fluente Em todos os outros casos, é melhor simplesmente ir para a classe e adicionar um método de instância diretamente. Vou dar-lhe alguns exemplos de métodos de extensão em. Vocês podem decidir se acham úteis ou não. Estes exemplos todos vêm de um estoque títulos de artigo estouro. Quais são os favoritos? Métodos de extensão. Então você já viu os dois métodos XML, que podem converter qualquer objeto em XML. Aqui está outro método legal. Você já teve que comparar uma variável inteira com muitos valores literais. Você está com frio, então é assim. Eu muitas vezes tive que escrever código como este ao implementar processadores de pagamento on-line em, Eu tive que analisar um revestimento de erro. Mas agora olhe para esses métodos de extensão. Com este método, posso simplesmente fazer isso. Deixe-me descer a costa. Veja, funciona. Eu trabalhei muito com bancos de dados em Ao ler dados de um banco de dados, eu muitas vezes precisa ser capaz de converter valor para qualquer tipo específico. Isso é bastante fácil de conseguir com a classe convertida, mas os métodos de extensão levam isso ao próximo nível. Confira este método. Este método leva qualquer valor que implementa o I interface conversível Aunt convertido para qualquer tipo determinado. Então agora eu posso simplesmente fazer isso. Estou convertendo uma string diretamente para uma entrevista. Vamos testar se isso funciona, eu estou executando o código agora Veja, ele funciona. Uma coisa estranha sobre o framework net DOT é que nem todas as classes de coleção suportam os métodos
organizados por anúncios , que permite adicionar toda uma gama de valores a uma coleção de uma só vez. Mas não se preocupe. Podemos criar um método de extensão para esta tarefa Então agora eu poderia sentir a coleção em um Go, por exemplo, o conjunto de hash. Vou comandar a causa. Aqui vamos nós. Tudo funciona enquanto estamos sobre o tema de tipos de coleção, você
já notou que a classe lista tem um muito bom para cada método? Mas outras classes de coleção não. Bem,
esses métodos de extensão fornece uma completa cada mensagem para todas as classes de coleção. Não, eu posso usar esses métodos em qualquer um dado nominal. Por exemplo, os conjuntos de hash que criei anteriormente. Isso dará direito a todos os valores no hash definido para o console. Deixe-me demonstrar. Vou dar a volta ao casaco. Veja, funciona. Então deixe-me resumir o que aprendemos nesta palestra métodos de extensão estão vendo táticas. Açúcar. Eles são métodos estáticos que você pode usar como se fossem. Instância. Métodos frequentemente dados mais métodos de extensão são úteis se você precisar estender uma classe selada ou uma classe que você não possui. Eles também são úteis se você precisa estender um tipo global ou se você está projetando um fluente P I. Os métodos de
extensão são controversos porque eles são primeiro deteriorados para os objetos reais. poluem Elespoluema inteligência pop on, eles podem se tornar uma banda AIDS para evitar ter que redesenhar uma hierarquia de objetos morcego.
12. Expressões de Lambda: chegamos à palestra final desta seção sobre, eu quero mostrar a vocês um recurso de linguagem muito agradável chamado London Expressions. Então vamos dar uma olhada. Digamos que eu tenha o seguinte trecho de código. Começo com um número inteiro, o número cinco. Então acho que ela comeu uma operação de matemática. Delegados em apontou para o método de multiplicação. Na próxima linha, chamo a operação, que efetivamente chamará os métodos de multiplicação, fornecerá o número e roubei esse resultado. Então, quando eu executar este programa, você pode ver que o resultado é 25. Como esperado, a vantagem de usar delegados é que eu posso facilmente mudar a operação matemática sem ter que mudar o frio. Qualquer mensagem que leve uma polegada e retorna com meios pode ser usada aqui, mas o código é um pouco para ambos agora, então vamos limpar isso. A primeira simplificação que eu posso executar é usar delegados genéricos em vez disso, O quadro dot net fornece os seguintes delegados genéticos úteis fora da caixa. A ação delicada que tira um parâmetro fora do tipo T e retorna void. O delegado funk que tira um parâmetro fora do tipo T e retorna de valor fora do tipo T resultados nos cartões de crédito. Delegar que toma um parâmetro off tipo T em retorna um booleano para meus resfriados. Eu vou precisar de um funk genérico delicado fora do tipo em sua entrevista vírgula porque eu tomar um parâmetro do tipo em Claro que não. Retorno um valor fora do tipo inteiro para que o código se pareça com isso. Eu não tenho mais que declarar os delegados da operação em massa porque eu estou usando os delegados genéticos do
funk embutidos , mas nós podemos dar um passo adiante. Em vez de ter que configurar um método de multiplicação privada. Eu posso escrever toda a operação em linha como esta. O que estou atribuindo à variável de operação é chamado de expressão Lambda. É uma implementação de uma linha delega que leva um parâmetro inteiro chamado X e retorna o quadrado fora X. Agora observe que eu não precisava mais de métodos privados. Eu não preciso especificar explicitamente o tipo off X. Todo
o programa acabou de ser reduzido a apenas três linhas de código, Então aqui está nenhuma revisão fora da sintaxe de expressão de Londres. Começarei com a que acabaste de ver. Este é um método em linha que leva um parâmetro off type team em retorna uma expressão o compilador irá inferir o tipo fora do valor de retorno em selecionar os
delegados funk genéricos corretos . Você pode adicionar quantos parâmetros quiser, ou você pode não ter argumentos, isso é tudo. Se você precisar de mais do que um valor de retorno simples, você pode usar várias instruções como este. Você também pode fazer um método de ação que não retorna um valor simplesmente deixando de fora a instrução
return ativada. Aqui estão as regras. Ao usar expressões Lambda quando você está atribuindo e expressão Lunda toe um delegado. as seguintes regras. O Lunda deve conter o mesmo número de parâmetros que o tipo de delegados. Cada parâmetro de entrada deve ser implicitamente convertível para o seu parâmetro delicado correspondente . O valor de retorno fora do Lambda, se ele existir, deve ser implicitamente convertível para o tipo de retorno delegados. Essas regras provavelmente não o surpreenderão, mas o bom aqui é que você não precisa combinar exatamente os tipos de delegado. Tudo funcionará bem, desde que haja uma conversão implícita do tipo londrino para o tipo delicado. Assim, por exemplo, quando um delegado espera parâmetros longos, você pode fornecer uma expressão London que usa inteiros em vez disso. Porque há uma conversão implícita de Inter show muito tempo sobre isso vai funcionar bem. As expressões de Londres podem se referir a variáveis que são declaradas dentro. Do lado de fora da expressão, referindo-se a uma variável externa é chamado Capturing the Variable Again. Existem algumas regras que você não pode capturar em variáveis inicializadas. Variáveis introduzidas dentro da expressão London não são visíveis nos métodos externos. Um Lunda não pode capturar um parâmetro ref ou out. Andi em Lunda não pode conter uma declaração ir para quebrar ou continuar que salta para fora da expressão. O inverso também não é permitido. Uma vez em que você precisa tomar cuidado é que os objetos de valor capturados permanecerão uma vida
enquanto o delicado existir. Isso pode levar a um cenário peculiar onde um fantasma variável fora do escopo, mas continua sendo uma vida porque foi capturado em uma Lunda que permanece no escopo. Esta é uma fonte muito comum de vazamentos de memória em aplicativos dot net. Agora vou mostrar-lhe como configurar um manipulador de cancelamento simples para um aplicativo de console, que esses códigos sejam executados quando eu pressionar o controle. Veja no console. Deixe-me demonstrar. Veja se funciona agora. Observe no casaco de origem que eu não forneço tipos em lugar nenhum. Minha expressão lambda especifica os nomes fora dos parâmetros de entrada, mas não há tipos. Isso é perfeitamente válido se o compilador pode inferir os tipos dos
delegados de imprensa de tecla cancelar . Esta é uma aplicação muito agradável fora do tipo de inferência. Ele se estende para os parâmetros fora de expressões Lambda. Então, na maioria das vezes você não precisa fornecer nenhum tipo. Isso é tudo. O compilador vai descobrir tudo. Outra coisa legal que você pode fazer é mudar expressões juntos. Digamos que eu queira criar um intervalo inteiro fora manipuladores de eventos cancelar com uma mensagem diferente cada vez que eu poderia fazê-lo assim. Observe a sintaxe de Lee encadeamento. Eu tenho um Lunda que retorna para Lunda, não retorna e até mesmo abaixo. Então isso configura uma Londres que leva um único parâmetro de mensagem, e ele retorna Outro lambda que espera Ascender em um evento ou experimentador. Então eu efetivamente criei a Lunda que cria erros. Posso usá-lo assim. Cada legal para fazer manipulador configura um novo evento sob com isso especifica mensagem em massa. Deixe-me correr o frio, ver tudo funciona. Este acorrentamento fora expressões Lunda juntos é extremamente poderoso. Aqui está um resumo do que aprendemos nesta palestra. Expressões Lunda estão em métodos de linha que podem ser atribuídos a delegados. Se você não especificar os tipos de parâmetro que o compilador irá para eles. Para você, londrinos podem se referir a variáveis dentro e fora da expressão. Referindo-se a uma variável externa é chamado capturar as variáveis capturadas variáveis permanecem na memória até que o delegado é lixo coletado. Isso pode levar a vazamentos de memória inesperados. Você pode encadear Landers juntos para criar londrinos que retornam londrinos.
13. O operador condicional de null: Ok, vamos começar com a nossa lista. Cool C. recursos de linguagem
Sharp introduzidos na versão mais recente. Seis. Como você se lembra, começamos a seção anterior com as mãos do operador não coalescente nesta palestra, eu gostaria de mostrar-lhe seu primo, o operador sem condicional. Então, digamos que eu tenha os seguintes métodos em meus projetos. Então, este método leva um valor de string e, em seguida, truncar senta para o número dado de caracteres Sons. O método midden chamado garante que o valor é truncado para não mais do que o
comprimento real fora do valor. Posso chamar este método no meu frio assim. É quando eu corro o frio. Você vê que ele escreve corretamente Mark Fucker para o controle as primeiras 9 letras do meu
nome completo . Mas agora veja o que acontece quando eu especificar e nenhum valor para a string. Deixe-me entrar no programa de novo. Você vê que ele fica que temido nenhuma exceção de referência no tribunal para sub string, e isso faz todo o sentido dentro dos métodos truncados. O parâmetro value agora é não. Então eu não posso chamar imprudentemente os métodos sub string nele. Preciso primeiro reformar um cheque explícito do Não. Agora, novamente, Como eu disse antes na palestra sobre o operador não coalescente, não
há nada de errado com um cheque nulo, mas eles podem ficar um pouco tedioso se você tiver que escrever centenas deles em seu projeto. Felizmente em C afiado 6, você não precisa mais fazer isso. Agora você pode simplesmente escrever isso agora, ver o que acontece quando eu dirijo as meninas. Não vejo mais nenhuma exceção de referência. E agora os Colts grava corretamente a string padrão no console. Então, o que aconteceu aqui? Bem, eu usei o operador especial sem condicional, que você escreve como ponto de interrogação em um ponto. O operador funciona exatamente como os períodos irregulares em que ele acessa um campos, uma propriedade ou um método em uma ocorrência de objeto. Mas quando a instância do objeto é não, o operador condicional simplesmente retorna Não. Então, na verdade, essa linha é convertida pelo compilador nesta linha. Mas com o benefício extra de que o valor só é avaliado mais uma vez, esta é uma forma de sintática curta C sharp six nos dá uma maneira compacta e eficiente de
realizar uma verificação nula. Eu vou fazer uma mudança no meu truncado, Sra. Eu vou alterar o método para que é sempre colocar o valor de volta para o comprimento original. Então, se eu pegar meu nome completo, que é 14 caracteres de comprimento em I truncado para nove caracteres, então eu quero que o método para preencher o nome truncado com cinco espaços adicionais para voltar a um resultado de 14 caracteres. Isso é muito fácil de realizar. Eu simplesmente preciso fazer isso de novo. Ele foi uma chamada para os métodos máximos para garantir que eu não preencha um número negativo de espaços . Então, agora o que acha que acontece quando eu fornecer um “sem valor”? Sabemos que o método sub string não será chamado. Mas e as almofadas? Método certo? Preciso substituir todos os períodos da minha cadeia de chamadas pelo operador sem condicional? Então, basicamente, o que eu estou perguntando aqui é como o compilador transforma essa linha de código assim ou
assim . É uma diferença sutil, mas com consequências profundas. Se o valor for não, a primeira transformação funcionará bem, mas a segunda transformação será lançada e nenhuma exceção de referência. Bem, vamos descobrir a resposta e ele vai executar o programa e veremos o que acontece. Aqui vamos nós dar uma olhada. Tudo ainda funciona. Então isso responde à pergunta. Foi a primeira transformação que te mostrei. O que está acontecendo aqui é um processo chamado sem propagação. Se você usar o operador não condicional na expressão à esquerda do operador é não , então absolutamente nada no lado direito desligado, o operador será executado. O operador não condicional curto-circuita a avaliação como retorna imediatamente. Não, isso é super útil porque significa que você só precisa colocar o
operador sem condicional do início da sua cadeia de chamadas. Cada carvão subseqüente pode usar o operador de período regular, e nenhuma propagação garantirá que essas chamadas sejam ignoradas corretamente se as instâncias não forem. Ok, então aqui está outro desafio para você. Confira o seguinte frio. Este código funciona bem. Como você pode ver sempre que no programa, ele é simplesmente deslocado zero no console. Mas aqui vai uma pergunta para você. Qual é o tipo fora da variável Len? Isso é um pouco de mistério. Se o nome não é conhecido, então é obviamente um inteiro. Mas e se o nome for não? É o riacho? Um velho verificou outra coisa? Bem, de novo, vamos descobrir. Vou colocar pontos de ruptura na linha certa. Declarações em Em seguida, executar o programa no desenvolvimento. Aqui vamos nós. Certo, agora o programa está suspenso. Essa é a linha correta. Agora, quando eu olho na janela local aqui, você pode ver que a variável Len é um número inteiro notável. Isto faz todo o sentido. Se o lado direito do operador não condicional avaliar o tipo de valor do dedo do pé
, os resultados da operação serão a versão conhecedora desse tipo de valor. Então, no meu exemplo de casaco, a variável torna-se inaudível em. Eu posso remover os teclados var explicitamente, direita para fora o tipo 1000 ins notáveis como este. Há uma simetria agradável para as chamadas de origem com pontos de interrogação no
lado esquerdo e direito do operador de atribuição para nos lembrar que estamos lidando com atribuições notáveis e na linha direita, declarações que você vê lá velho amigo do que nenhum operador coalescente aparecer novamente para fornecer um valor
padrão. Se o nome for não, eu também posso declarar a variável como um não notável no futuro e você não vê nenhum
operador coalescente supervisionar um valor padrão como este. Então, agora a variável avalia para um inteiro explícito, não cognoscível sobre este bem limpa as declarações de linha direita. Ok, então aqui está outro exemplo. Você aprendeu tudo sobre métodos de extensão nas instruções yield return na
seção anterior . Então agora eu vou combinar esses dois. Confira isso. Então, esses métodos de extensão escolhe um conjunto especificado fora itens de uma lista e os retorna como uma enumeração. Mas a mensagem ignora automaticamente quaisquer itens sem e apenas retorna nenhum. Sem itens, então eu posso executar este código da seguinte forma. Deixe-me entrar no programa. Aqui vamos nós e você vê que eu só recebo o não há valores no console. Estou usando o operador sem indexação condicional em meus métodos, que você escreve como um ponto de interrogação, seguido por um colchete de abertura. Isso irá indexar uma coleção ou em admiração, instância, a menos que instâncias não, Nesse caso, o operador curto-circuitos em simplesmente retorna. Não. Então você vê que há duas versões fora do operador não condicional, uma com um ponto que acessa uma propriedade de campo ou métodos geralmente instância de objeto. E um com colchetes, que acessa o indexador. Muitas vezes objeto. Instância, Ambos os operadores curto-circuitos. Se as instâncias não, caso
em que eles imediatamente retornaram. Agora, sem avaliar a expressão no lado direito do operador. Tenha em mente que ele não é indexação condicional. Operador não distingue entre uma instância sem objeto. Quatro. Uma instância de objeto válida que apenas por acaso contém um valor. Não. Se você precisar distinguir entre esses dois, então você terá que executar o teste manualmente. Vou mostrar-lhe um último exemplo de como usar o operador sem condicional. Confira o seguinte casaco. Você vai reconhecer nossos velhos amigos um pouco sob expressão sendo assinado para uma
função genérica delegados. Então este casaco leva o número cinco, quadra-o chamando a operação, em
seguida, escreve o resultado para o controle. Mas e se as iguarias não forem assim? Agora? A segunda linha off códigos vai lançar uma exceção sem referência porque o delicado é não. Então eu preciso adicionar um cheque para não antes de poder invocar com segurança os delegados. Você sempre precisa verificar se há não antes de chamar delegados. Não há como contornar isso. Bem, até agora, é com o operador sem condicional. Agradeça a isso. Eu usei o operador sem condicional para chamar com segurança os métodos invocar nos delegados em um curto-circuito para saber se o delicado é não. Então eu usei o familiar, nenhum operador de coalescência para fornecer um valor padrão off. Zero. Se o resultado for não, deixe-me executar o programa e você verá que eu obtenho o valor zero exatamente como esperado. Portanto, esta é uma ótima técnica para evitar digitar a verificação nula quando você invocou delegados . Basta usar o operador sem condicional em segui-lo com os métodos invoke. E novamente, tenha em
mente que um não delegados condicionais na vocação não distingue entre um não delegados ou um delegados valência. Isso só volta por acaso. Não, se você precisa distinguir entre esses dois, então você terá que fazer o teste manualmente. Ok, aqui está alguém fora do que aprendemos nesta palestra. O operador não condicional retorna. Não. Se a expressão no lado esquerdo do operador for não, o operador fará curto-circuito quaisquer invocações adicionais na cadeia de frio no lado direito do operador. Se a expressão à esquerda do operador for não, o operador retornará um tipo experiente. Se a expressão no lado direito fora do operador retornar o tipo de valor, o operador oferece suporte à invocação de delegados na maneira segura de ameaças. O operador está disponível tanto como um membro fora de uma navalha quanto como um operador de indexação.
14. Iniciantes de propriedade: as próximas escolas ele afiada seis recurso Eu gostaria de mostrar-lhe é a propriedade também inicializar er lembrar Na seção anterior quando falamos sobre auto propriedades, discutimos por que você gostaria de usar propriedades porque você também poderia simplesmente usar público campo como este. São os mesmos trechos de código que mostrei na palestra “Outer Properties”. Estou simplesmente usando um campo público aqui, mas observe que eu também adicionei em objetos inicializar er para que esta classe pessoa fica inst enshi ated com o meu nome como o padrão. Agora você aprendeu que há muitas boas razões para usar fora de propriedades em vez de campos
públicos. Então eu deveria usar esse casaco. Mas agora eu tenho um problema. Eu não posso mais inicializar o campo de apoio de propriedade automática com o objeto initialize er para inicializar no nome, eu terei que adicionar um construtor padrão e fazer a inicialização lá. Isso é um monte de código extra apenas para uma simples inicialização de campo em que faz você querer
voltar a apenas usar sentimentos públicos em vez disso. Felizmente, C afiado seis vem para o resgate. Agora você pode inicializar a propriedade exatamente da mesma maneira que ela inicializaria os campos como este. Isso configura uma propriedade string chamada name também gera um getter no centro em. Então inicializar é os campos de apoio com o meu nome. Bem, em uma única linha de código, você pode estar pensando que a Microsoft está exagerando um pouco com resfriados fora da
geração antiga . Mas olha para isto desta forma. É muito bom que esta sintaxe para inicializar uma propriedade agora é exatamente a mesma que a sintaxe. Para inicializar um campo, você não precisa mais memorizar a regra arbitrária que os objetos inicializam. Er não funcionam em propriedades. Não há razão para não o fazerem. E agora a Microsoft removeu essa limitação. Na palestra Propriedades Automáticas da seção anterior, eu mostrei como criar no tipo imutável. Esta é uma classe que você só pode inicializar no construtor e do Zen, um, seus estados internos não podem mudar. Eu implementei o tipo musical com uma saída ou propriedade com apenas e pegá-la. O compilador nítido C reconhece que eu quero criar no tipo imutável em
gera automaticamente um somente leitura campos de suporte. Então, o que é se eu quiser Cody ajuda em tipo musical com um valor padrão. Bem, agora você pode simplesmente fazer isso. Observe que eu removi a liquidação da propriedade externa, o compilador em primeiro lugar que eu quero que o tipo de pessoa para ser imutável em para que ele gera um
somente leitura campos de apoio e um getter de propriedade pública. Mas agora ele também inicializar é os campos de apoio para o meu nome. Estas brasas podem parecer um pouco estranhas para você porque estou basicamente montando uma constante aqui. Mas lembre-se de que a expressão de inicialização pode ser qualquer expressão estática. Ondas complexo como você gosta, por exemplo, para inicializar a propriedade name para o usuário bloqueado atual. Você pode fazer isso, e aqui está outro exemplo que eu posso combinar em imutável. Também propriedade com carregamento preguiçoso para criar uma fábrica. Métodos de instância em uma única linha de código como esta. Isso se configura na propriedade externa imutável chamada atual, que instância preguiçosa Yates para uma nova pessoa. Instância, a primeira vez que é chamado Este é um padrão de instância de fábrica completamente funcional com carregamento
lento. Ok, aqui está alguém fora do que aprendemos nesta palestra. Você pode pads objetos, inicializar er para propriedades alto seguindo a declaração de propriedade com na expressão de
inicialização, você também pode inicializar propriedades alto imutáveis que só têm juntos também propriedade inicializar. Er pode ser expressões complexas que chamam métodos estáticos. Você pode combinar imutável. Além disso, as propriedades com a classe lenta dois criam métodos de instância de fábrica.
15. Expressões de declaração: Nesta palestra, eu gostaria de mostrar-lhe expressões de declaração, consumidor. Os seguintes trechos de código. Este loop lê caracteres do console até que eu pressione a tecla Enter o loop while testa o primeiro caractere em Se não é uma camada de alimentação de linha, é, escreve Lee personagem para o console. Então o frio lê. O próximo caractere no loop se repete Você costuma ver chamado assim em projetos C Sharp, com os métodos de leitura repetidos duas vezes no loop. A razão para isso é que, em uma única inspiração loop, precisamos do dedo do pé, ler o personagem, testá-lo e escrevê-lo com o console. Eu não posso suportar várias instruções de leitura no corpo do loop, e eu tenho que ler para o personagem antes de entrar no loop para ter certeza de que eu não escrever nenhum feed de
linha chamado Still Console Declaration expressões tornar muito fácil toe simplesmente cinco discotecas, e você vê-los surgir muitas vezes em outras línguas que os suportam, Mike See ou javascript em. A boa notícia é que a Microsoft adicionou expressões de declaração para ver Mostrar. Seis. Então agora posso defender os códigos assim. Então, agora a atribuição acontece dentro do loop while, Verifique o revestimento, atribui a variável de entrada em, em
seguida, verifica imediatamente se a variável não observa. Contém uma linha alimenta frio,
em seguida, o loop continua escrevendo o caractere no loop repete. Essa alteração simplificou muito o código-fonte. Outra coisa legal que você pode fazer com suas expressões declaração é preguiçoso cargas propriedades quando eles são primeiras chamadas. Você se lembra da palestra sobre o operador não coalescente na seção anterior, onde eu criei uma propriedade construtor impressionante com carregamento preguiçoso? O conde era assim. Então aqui o frio do lado direito do operador coalescente conhecido é uma
expressão de declaração . Portanto, esta propriedade retorna o campo de buffer. Se não souber. Mas se o buffer é não, em
seguida, os códigos executa na inicialização de vôo fora do buffer e, em seguida, retorná-lo usando uma expressão de declaração. Esta é uma maneira compacta de sair. Escrever propriedades de carregamento lento no código-fonte agora é muito legível. Ok, deixe-me resumir o que aprendemos nesta declaração de palestra. Expressões são atribuições que se comportam como expressões. Expressões de declaração retornam o que está no lado direito do operador de atribuição. Você pode usar expressões de declaração para remover atribuições duplas. Certifique-se de que os métodos são chamados apenas aqueles ons implementa propriedades de carregamento preguiçoso.
16. Funções e propriedades para serem ampliadas e propriedades: na seção anterior, eu mostrei a você como usar expressões Lunda. Estas são funções compactas em linha que você pode facilmente atribuir a um delegados, por exemplo, como este. Então, isso configura um delegado que espera um único parâmetro de entrevista como retorna interesse seu valor, que é o quadrado fora do parâmetro especificado. As expressões de Londres são maneiras super úteis de expressar compactos em funções de linha e link
usa-os em todos os lugares. Então, se você é novo para ver nítido, você pode estar se perguntando por que você não pode usar expressões de Londres em funções regulares como esta . Esta sintaxe parece perfeitamente lógica. Estou configurando uma função aqui chamada Operação que espera um único parâmetro de entrevista e retorna o valor quadrado como um inteiro e no lugar fora do corpo do método. Eu uso uma expressão de Londres Espadas fora como os objetos inicializam er, sintaxe. Infelizmente, este código não irá compilar barramento. Microsoft reconheceu essa discrepância no uso de expressões Lambda como agora em C sharp seis, você pode usar expressões Lambda nas declarações de função regular. Confira os seguintes sniffers frios. Agora eu posso usar a classe como este aviso que eu uso em objetos de linha inicializar er aqui para configurar a instância pessoa na linha direita. Métodos irá chamar os métodos de cadeia de caracteres para obter a representação de cadeia fora do objeto, e isso irá então chamar a minha expressão Lunda que simplesmente junta o primeiro nome e sobrenome juntos. Deixe-me verificar os códigos. Verifica os sons. Lá vai você. Esse é o meu nome. Então isso é na expressão. Função corporal. Em poucas palavras. É simplesmente uma declaração de função onde você fornece o corpo da função como uma
expressão de madeira serrada . Não há nada de especial acontecendo aqui. É simplesmente uma maneira mais compacta de declarar funções no seu casaco. A coisa boa sobre este recurso é que ele permite que você use expressões Lambda em qualquer lugar, tanto em atribuições de delegado em quando declarar funções regulares. Você não precisa mais se lembrar de regras arbitrárias sobre quando elas são permitidas ou não, então isso é cobre funções. Mas e as propriedades? Não vai surpreendê-lo que você também pode usar expressões de madeira ao declarar propriedades. No entanto, há uma regra simples que você precisa seguir. A propriedade não pode ter um centro Agora isso faz todo o sentido. Quando você pensa sobre isso. O que aconteceria quando você definisse expressão, corpos, propriedade. Não faz sentido. Então aqui está minha aula pessoal de novo. Mas agora com uma propriedade extra que verifica se a pessoa tem um primeiro aviso nome que eu
não especificar um levá-la como quando eu estou configurando em propriedade alto. Nesta sintaxe, a seta Lunda segue diretamente o nome da propriedade sem especificar gets ou define palavras-chave . O compilador leva minha expressão Londres em Cria uma propriedade getter em torno disso. Então, agora a propriedade tem cheques de primeiro nome. Se o primeiro nome fora da pessoa foi fornecido. caso afirmativo, a propriedade retorna true. Vamos ver o que acontece quando eu correr este frio. Aqui vamos nós e você pode ver que eu tenho realmente especifica meu primeiro nome ao configurar a instância
pessoa. Ok, deixe-me resumir o que aprendemos nesta palestra expressão funções corpo são
funções onde você fornece a implementação como uma expressão Londoner, corpos de
expressão, propriedades são propriedades onde você fornecer a implementação como uma expressão Lunda expressão corpos propriedades são somente leitura para que você não possa usar o centro
17. Espere em captura e finalmente: meu próximo recurso de idioma veja loja é enganosamente simples. Você sabia que você não poderia usar os teclados de peso em uma captura ou, finalmente, declarações? A razão para isso é que o compilador executa algumas conversões de código bastante radicais cada vez que você usar a palavra-chave await, e a Microsoft não conseguiu descobrir como reconciliar essa transformação fria com um manipulador de
exceção, Compare isso com as instruções de retorno de rendimento, que você viu anteriormente Quando você usa você retornaria em um loop. O compilador afiado C rasga seus códigos de peças remove completamente um loop, move o corpo do loop para um novo na classe numerador em embaralha as cartas ao redor para gerar uma máquina de estado. O aguarda teclados funciona da mesma maneira Cada vez que você usar o aguarde, o compilador executa uma significativa re fatoração fora de sua costa para garantir que a mensagem você está chamando pode realmente executar um sincronicamente a partir dos amigos mais frios mãos qualquer uma pia. Medicals dentro de uma captura ou finalmente bloquear simplesmente não sobreviveu a este processo re factoring. Mas como todas as coisas que parecem impossíveis no início, alguns engenheiros da Microsoft sentaram-se e pensaram bem sobre isso. Eles descobriram um jeito de fazer isso, afinal. Então agora essa limitação é levantada em C afiado seis. Dê uma olhada nos seguintes códigos para que estes códigos de um pedido síncrono meu tamanho mordida. Ela afiou o blawg, mas eu cometi um erro de digitação no U. R L. Diz, mordida do tamanho afiada em vez do tamanho C afiado. Então agora esses códigos lançarão uma exceção da Web. Quando eu executá-lo, Eu tenho dobrado uma tentativa de captura bloco em torno deste trechos frios libras. Eu pego a exceção da Web. Então eu olhei. O erro no método de registro se parece com isso. Portanto, esses métodos simplesmente registra a exceção para um arquivo. Mas, como uma operação síncrona, esses trechos de código retém o padrão de método assíncrono durante todo o bloco de tentativa e caixa. Em nenhum momento, , eu forcei a fazer uma chamada síncrona porque o compilador não suporta. Então deixe-me resumir o que temos. Lawrence nesta palestra, quando você usa aguarda o compilador, os refletores, seu casaco para garantir que os métodos podem executar um sincronicamente. Até agora, este re fatoração em situação difícil que você não poderia usar um peso em uma captura ou, finalmente, bloquear o que está em c afiado. Seis. Isso agora é possível
18. Receita do curso: Parabéns. Você completou todo o curso. Agora você foi apresentado aos recursos avançados de linguagem C Sharp. Eu mostrei como apimentar o seu casaco com a variedade de recursos avançados, como métodos de
extensão, personalizado em operadores conhecidos, coalescentes e condicionais operadores ligar expressões de consulta mãos muito, muito mais. Você tem a maioria dos seguintes recursos de idioma Avançado. O conhecido operador de coalescência. moldes tipo suave, auto propriedades, métodos de
estudo, o uso de instruções, objetos e coleção inicializar expressões de equidade link er. Os rendimentos, declarações de
retorno, métodos
de extensão. Expressões Andi Lunda. Você também estava agora atualizado com os novos recursos de linguagem em C Sharp Versão 6. Você dominou o seguinte operador sem condicional. Além disso, propriedade inicializar expressões declaração er, expressão, funções do
corpo e propriedades sobre o Yusof aguarda em captura,
e, finalmente, essas habilidades irão ajudá-lo a escrever melhor, mais limpo e compactos mais frio. Se você descobrir alguns insights interessantes por conta própria,
por favor, compartilhá-los no fórum de discussão do curso para todos nós desfrutarmos de Good Bye, e espero que nos encontremos novamente em outro curso