tutorial expresiones c# .net lambda

expresiones - linq c#



¿Qué significa el nombre "DisplayClass" cuando se llama a lambda? (3)

Basado en Reflector, DisplayClass se puede traducir como CompilerGeneratedClass

[CompilerGenerated] private sealed class <>c__DisplayClass16b { // Fields public MainForm <>4__this; public object sender; // Methods public void <cmdADSInit_Click>b__16a() { ADS.Initialize(); this.<>4__this._Sender = this.sender; this.<>4__this.SelectedObject = ADS.Instance; } }

Según esta respuesta, cuando el código usa variables locales desde dentro de los métodos lambda, el compilador generará clases adicionales que pueden tener un nombre como c__DisplayClass1 . Por ejemplo, el siguiente código (completamente inútil):

class Program { static void Main() { try { implMain(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } static void implMain() { for (int i = 0; i < 10; i++) { invoke(() => { Console.WriteLine(i); throw new InvalidOperationException(); }); } } static void invoke(Action what) { what(); } }

genera la siguiente pila de llamadas:

System.InvalidOperationException at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0() at ConsoleApplication1.Program.invoke(Action what) at ConsoleApplication1.Program.implMain() at ConsoleApplication1.Program.Main()

Tenga en cuenta que hay c__DisplayClass2 allí, que es un nombre de una clase generada por el compilador para contener la variable de bucle.

De acuerdo con esta respuesta c__DisplayClass "significa"

c -> clase de cierre de método anónimo ("DisplayClass")

De acuerdo, pero ¿qué significa "DisplayClass" aquí?

¿Qué significa que esta clase generada "muestra"? En otras palabras, ¿por qué no es "MagicClass" o "GeneratedClass" o cualquier otro nombre?


De una respuesta a una pregunta relacionada por Eric Lippert :

La razón por la que una clase de cierre se llama "DisplayClass" es un poco desafortunado: esta es una jerga usada por el equipo de depuración para describir una clase que tiene comportamientos especiales cuando se muestra en el depurador. Obviamente, no queremos mostrar "x" como un campo de una clase de nombre imposible cuando está depurando su código; más bien, quieres que se vea como cualquier otra variable local. Hay una herramienta especial en el depurador para manejar este tipo de clase de visualización. Probablemente se debería haber llamado "ClosureClass" en su lugar, para que sea más fácil leer el desmontaje.


Puede obtener información de la fuente del compilador C # disponible en el subdirectorio csharp / sccomp de distribución SSCLI20. La búsqueda del código para "mostrar" proporciona la mayoría de las visitas en el archivo de código fuente fncbind.cpp. Lo verá utilizado en símbolos de código, así como en comentarios.

Los comentarios sugieren fuertemente que este fue un término utilizado internamente por el equipo, posiblemente ya en las reuniones de diseño. Este es el código vintage de .NET 2.0, todavía no había mucha reescritura de código. Solo iteradores y métodos anónimos, ambos implementados de maneras muy similares. El término "clase de visualización" está desviado de "clase de usuario" en los comentarios, una pista clara de que usaron el término para indicar clases generadas automáticamente. No hay una pista clara de por qué se favoreció la "visualización", sospecho que podría tener algo que ver con que estas clases sean visibles en los metadatos del ensamblaje.