Lambda Expressions: comportamento do compilador

9

Bem, eu estou passando pelo tópico 'Lambda Expressions' (Capítulo 17; Delegados, Açúcar Sintético C # para os Delegados). Jeffrey afirma que o compilador C # cria uma nova classe não estática no plano de fundo que tem o seguinte:

  1. Campos para armazenar todas as variáveis locais que foram acessadas na Expressão Lambda.
  2. Um método cujo corpo contém a Expressão Lambda e cujo tipo de assinatura / retorno corresponde ao delegado para o qual o Lambda Expressin foi usado.

Eu tenho as duas perguntas a seguir:

  1. Eu fiz uma pequena depuração e vi que se o Lambda Expression modifica o valor de uma variável local (definida em um método no qual o lambda Expresison está sendo usado), o novo valor é refletido fora do corpo da expressão também . Como isso é possível considerando que a expressão está em uma classe diferente?

  2. Por que a classe emitida precisa ser não estática quando o mesmo pode ser feito pela classe estática perfeitamente?

Espero que este não seja um conceito muito simples que eu não consiga compreender.

Deixe-me saber se preciso fornecer mais detalhes.

    
por astraldust 14.03.2013 в 10:10
fonte

1 resposta

5

Primeiro de tudo, eu tive uma pergunta semelhante, há alguns dias.

O fechamento da variável capturada modifica o original

Em segundo lugar, qual é o sentido de torná-lo uma classe estática? Apenas um objeto é criado de qualquer maneira, e esse objeto não precisa viver durante toda a vida útil da aplicação.

the new value is reflected outside the expression body too. How is this possible considering the expression is actually in a different class.

A coisa é que o mesmo objeto está sendo referenciado tanto pelo método anonymus, quanto pela variável local fora do método anonymus, então não importa de onde você o altera, você muda a mesma coisa.

Além disso, a resposta fornecida por Tim Goodman na pergunta à qual eu estou vinculado mostra o que fazer, a fim de evitar que as alterações sejam refletidas em todos os lugares, criando um novo objeto dentro do seu método anonymus.

    
por Freeman 14.03.2013 / 10:14
fonte