No es necesario, por lo menos en c# y entiendo que IML es común. Así estás duplicando la información.
¿Por qué antes de contradecir a alguien no haces la prueba del algodón con un profiller de memoria para .Net que te muestre las fugas o
leaks de memoria provocadas (y la relación a objetos, etc) antes de afirmar algo así?, las cosas se pueden decir de otra manera, parece que critiques por criticar o compitas por competir.
Simplemente dale un vistazo a la referencia del código fuente online de .Net Framework, a los controles built-in de
WinForms, y si profundizas verás de lo que hablo...
Cómo ya comenté, la class
Control (y
UserControl) implementa la interfáz
IDisposable; pues obviamente los controles built-in de
Winforms utilizan recursos administrados, cómo no administrados, por lo tanto se debe llamar al método implementado
Control.Dispose() si o si.
Hay otras classes que implementan la interfáz
IDisposable y no es estrictamente necesario llamar al método
Dispose() (ej. la class
Process), pero este no es el caso.
El caso en el que realmente no sería necesario llamar a
Control.Dispose(), sería si el control se añadiese a una colección de controles administrada (class
ControlCollection) y liberases el control padre de esa colección (por ejemplo, al añadir los controles a la colección de controles de un
Form, y despues de eso, liberar el
Form), en ese caso
WinForms administraría automaticamente las llamadas al método
Control.Dispose() por cada control de la colección, de lo contrario, no, y ese no es el caso, ya que aquí la pregunta trata sobre crear controles dinámica e indefinidamente cada vez que suceda "x" evento, y así... si no los liberas, el
garbage-collector no los va a liberar por ti.
Un simple for each Control in Formulario.Controls te da una referencia y por tanto no es necesario almacenar otro array.
1. No conozco a ninguna otra persona que le resulte más "simple" escribir código repetitivo con un For, que declarar una referencia de nombre corto o
shortname ref;
Indiscutiblemente es más productivo que escribir el bloque de un For, y es más eficiente que irerar una colección de controles hasta encontrar dicho control.
2. No es duplicar.
Aquí tienes un simple ejemplo demostrativo siguiendo la linea del código que publiqué arriba:
Dim ctrls As ICollection(Of Control) = New HashSet(Of Control) From {
New Control
}
Me.Controls.AddRange(ctrls.ToArray)
Me.Controls(0).Dispose()
MsgBox(ctrls(0).IsDisposed())
...Conviértelo a C# si quieres, estoy vago.
Para todos los controles que no están heredados de la API nativa de Windows, es decir no tienen un hWnd
Todo control (o user-control) es practicamente una ventana
Win32, ya que implementa la interfáz
IWin32Window, por lo tanto tienen un handle de ventana o
hWnd, todos, ya que los controles de
WinForms están basados en este modelo
Win32.
Sin embargo, si estuviesemos hablando de
WPF, la cosa sería distinta, pero obviamente tampoco es el caso. De todas formas de tecnología WPF si que se muy poquito, lo he usado muy poco.
Sin más, espero que esto haya sido suficiente con los motivos o argumentos que he dado. Si tienes preguntas al respecto, haz las que quieras (pero por favor, formula cualquier pregunta en un nuevo post, no invadamos más este hilo con offtopics).
Saludos.