Esta é uma pergunta de acompanhamento para essa outra pergunta.
fundo
Trabalhando no Tutorial de Delegados do MSDN (C #) , vejo o seguinte:
Observe que depois que um delegado é criado, o método ao qual ele está associado nunca muda - os objetos delegados são imutáveis.
E então, no exemplo de código, vejo isso (espalhe um pouco pelo código):
public delegate void ProcessBookDelegate(Book book);
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
A questão
Agora, obviamente, da maneira como o código é escrito aqui, um novo delegado é criado para cada processo. Eu estou supondo que a imutabilidade é relevante se você tentar fazer coisas como
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal);
que deve ... ainda compilar quando thisIsATest
é imutável? Então, que problema a Microsoft resolveu tornando-a imutável? Quais problemas encontraríamos se o C # 6 tornasse os delegados mutáveis?
EDITAR
Acredito que a imutabilidade impedirá isso:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest.ChangeTheDelegateInABadFashion();
someFunction(thisIsATest); //This function works as normal
//because the delegate is unchanged
//due to immutability
mas a imutabilidade NÃO impedirá isso:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest = new ProcessBookDelegate(ChangeTheDelegateInABadFashion());
someFunction(thisIsATest); //This function works weird now because
//it expected the unchanged delegate
Estou correto neste entendimento?
fonte
Func<int>
que retornasse 1 o primeiro quando é chamado, 2 o segundo, etc. - isso se comporta essencialmente como um objeto mutável.s[2] = 't'
.Razões em suma:
Confira estas duas perguntas no Stack Overflow para obter mais informações:
fonte
segurança padrão da linha, acredito; se você souber que um delegado nunca mudará, faça algumas suposições sobre isso
em particular, você pode ter certeza de que um código incorreto não pode alterar o delegado que você está passando para várias funções (mesmo que por acidente)
isso pode dificultar o rastreamento de bugs e deixar o programador se perguntando por que seu delegado não foi chamado
fonte
A resposta simples é alterar um delegado, faz muito pouco sentido. Um delegado é muito uma referência a uma função, um conjunto de código em execução. Mutação que sugere que você está mutando essa função.
Pergunte-se, como seria esse método em um delegado e o que faria? Em certo sentido, seria reescrever o código dessa função. Isso abre uma quantidade enorme (quase intratável) de complexidade às implementações de especificação e compilador C # para pouquíssimo benefício com grandes custos de desempenho. Daí a restrição.
fonte