A menudo ese tipo de variables se utilizan para mantener los iteradores. C# tiene estos integrados directamente en el lenguaje a través de la palabra clave yield
. He aquí un ejemplo:
IEnumerable<int> TimesTable(int table)
{
for (int i=0 ; i<12 ; i++)
{
yield return i * table;
}
}
En este ejemplo, creamos los valores de la tabla n veces, donde n es especificado por la persona que llama. Podemos utilizar esto en cualquier lugar se utiliza un repetidor, como en un bucle foreach
:
foreach (var value in TimesTable(3))
{
Console.Write(""+ value + " ");
}
... que produce:
3 6 9 12 15 18 21 24 27 30 33 36
En C++, esto podría haber utilizado variables estáticas como los que se describen desde VB (no soy un tipo VB, así que no sé la sintaxis VB):
int TimesTable(int table) {
static i = 1;
if (i == 12) {
i = 1;
}
return i++ * table;
}
la versión C# es mejor que el C++ (o VB) equivale becuase el iterador se puede cancelar la oreja y puede haber múltiples iteradores activos en un momento dado. Estas cosas no son ciertas para la versión C++ sin más trabajo del desarrollador. En el lado negativo, significa que la única vez que algo como una variable estática es válido en C# es durante la implementación de un iterador, y el valor no persiste más allá de ese alcance.
Espero que sea de alguna utilidad para usted.
Usar el constructor estático para inicializar un campo delegado con un cierre es probablemente un poco más cercano en términos de acceso a la variable (a diferencia del campo estático, no se verá reflejado en la clase o visible para otros métodos de clase) –
@Ben - enfoque interesante, pero con mucha complejidad adicional: lograr que la gente entienda las variables capturadas es complicado en el mejor de los casos; --p –
OK, lo entiendo, pero * ¿por qué? ¿Rompe OOP de alguna manera? – blez