Esta es una pregunta de seguimiento a esta otra pregunta.
Antecedentes
Trabajando desde el Tutorial de delegados de MSDN (C #) , veo lo siguiente:
Tenga en cuenta que una vez que se crea un delegado, el método con el que está asociado nunca cambia: los objetos delegados son inmutables.
Y luego, en el ejemplo de código, veo esto (Extender un poco a través del código):
public delegate void ProcessBookDelegate(Book book);
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
La pregunta
Ahora, obviamente, la forma en que se escribe el código aquí se crea un nuevo delegado para cada proceso. Estoy adivinando la inmutabilidad es relevante si se trata de hacer cosas por el estilo
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal);
que debería ... aún compilar cuando thisIsATest
es inmutable? Entonces, ¿qué problema ha resuelto Microsoft haciéndolo inmutable? ¿Qué problemas tendríamos si C # 6 hiciera mutables a los delegados?
EDITAR
Creo que la inmutabilidad evitará esto:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest.ChangeTheDelegateInABadFashion();
someFunction(thisIsATest); //This function works as normal
//because the delegate is unchanged
//due to immutability
pero la inmutabilidad NO evitará esto:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest = new ProcessBookDelegate(ChangeTheDelegateInABadFashion());
someFunction(thisIsATest); //This function works weird now because
//it expected the unchanged delegate
¿Estoy en lo correcto en este entendimiento?
Func<int>
que devuelva 1 el primero vez que se llama, 2 el segundo, etc., esto se comporta esencialmente como un objeto mutable.