Tenho feito desenvolvimento em .NET há muito tempo e recentemente resenhei o livro "C# Advanced Programming". Percebi que muitos problemas que antes parecia entender, mas não compreendia, na verdade podem ser estudados e compreendidos aos poucos.
Então, pretendo começar a escrever um post no blog sobre a "Série de Programação Avançada em C#". Ele se baseará no conceito do livro "C# Advanced Programming" e também fará referência aos posts de blog de outros especialistas, espero que você entenda. Se houver algo errado, por favor, corrija.
(Além disso: Este post no blog não explicará o básico de definições e gramática.) )
Vamos falar sobre comissionamento.
Delegate é amplamente usado no .NET. Expressões lambda, eventos, métodos de anonimato, etc., estarão envolvidos (fique ligado para posts futuros no blog).
Então, o que é entrustment?
Em termos leigos, delegados não são diferentes de especificar métodos, exceto que devem especificar a palavra-chave delegado e não possuem entidade de método. Você pode pensar nisso como um marcador de lugar, por exemplo, quando escreve código sem saber com o que vai lidar. Você só precisa saber qual é o tipo de parâmetro e o tipo de saída que vai introduzir e defini-los. Esse é o método transmitido no livro de que a assinatura deve significar o mesmo.
Vamos definir uma delegação básica:
Resultados da execução:
Você vê o lugar prático acima para confiar? Ou seja,Um delegado pode executar qualquer método com o mesmo tipo de parâmetro de ingestão e tipo de retorno, ou até mesmo uma fila de método com a mesma assinatura.
Então, nossas assinaturas de método (ou seja, parâmetros de importação e saída) realmente precisam ser exatamente iguais às do delegado? Resposta: Não, não podemos ignorar a covariância e a variação inversa. Vamos apresentar brevemente o conhecimento sobre covariante e inversor.
"Covariância" significa ser capaz de usar um tipo mais derivado do que o tipo derivado originalmente especificado. "Inversor" refere-se à capacidade de usar um tipo com menor grau de derivação. Então, nossa comissão também está sujeita a covariância e inverso.
Isso significa que, se um delegado for definido, não apenas o mesmo método de assinatura pode atribuir valor à variável delegada.
Se a tabela de parâmetros de um método corresponder à declaração do delegado, mas retorna uma classe derivada de (a declaração do delegado retorna o tipo), então o método também pode ser atribuído a essa variável do delegado.
Se o tipo de retorno de um método corresponder à declaração do delegado, mas o argumento for a classe ancestral do tipo de parâmetro de declaração do delegado, então o método também pode ser atribuído à variável delegada.
Se os parâmetros e o tipo de retorno de um método corresponderem às suposições nas duas linhas acima, então o método também pode ser atribuído à variável delegada.
A seguir está um exemplo simples de covariante vs. inversor:
Covariância:
Inversor:
|