2011-12-14 9 views
11

Es decir, en C, podemos definir una función como:¿Existe una palabra clave en C# que haría que las variables locales persistan en varias llamadas?

func(){ 
    static int foo = 1; 
    foo++; 
    return foo; 
} 

y ha de devolver un número más alto cada vez que se llama. ¿Hay una palabra clave equivalente en C#?

+0

C fue inventado cuando las discusiones no existían todavía. También lo fue Visual Basic, tuvieron que implementarlo en vb.net. La cantidad de código que necesita generar para que sea segura y la excepción es bastante masiva. –

+0

Una pregunta muy buena –

Respuesta

17

No, no existe tal cosa en C#. Todo el estado que desea persistir en varias llamadas a métodos debe estar en los campos, ya sea instancia o estática.

Excepto ... si captura la variable en una expresión lambda o algo así. Por ejemplo:

public Func<int> GetCounter() 
{ 
    int count = 0; 

    return() => count++; 
} 

Ahora puede utilizar:

Func<int> counter = GetCounter(); 
Console.WriteLine(counter()); // Prints 0 
Console.WriteLine(counter()); // Prints 1 
Console.WriteLine(counter()); // Prints 2 
Console.WriteLine(counter()); // Prints 3 

Ahora, por supuesto que sólo está llamando GetCounter() una vez, pero que "variable local" es, sin duda viviendo en mucho más allá del tiempo de vida que podría tener esperado ...

Eso puede o no ser de alguna utilidad para usted, depende de lo que esté haciendo. Pero la mayoría de las veces realmente tiene sentido que un objeto tenga su estado en campos normales.

+1

¿Usar un cierre para simular una variable local estática constituye un código malvado? – sq33G

+0

@ sq33G: depende exactamente de cómo lo esté usando, creo ... –

1

Habría que crear una variable miembro estática o instancia de la clase es el método en.

0
public class Foo 
{ 
    static int _bar = 1; 

    public int Bar() 
    { 
     return ++_bar; 
    } 
} 
Cuestiones relacionadas