2011-12-14 12 views
11

Cioè, in C, si può definire una funzione come:Esiste una parola chiave in C# che renderebbe permanenti le variabili locali attraverso più chiamate?

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

e restituirà un numero più alto ogni volta che viene chiamato. Esiste una parola chiave equivalente in C#?

+0

C è stato inventato quando i thread non esistevano ancora. Quindi era Visual Basic, dovevano implementarlo in vb.net. La quantità di codice che deve generare per renderla thread ed eccezionalmente sicura è abbastanza massiccia. –

+0

Un'ottima domanda –

risposta

17

No, non c'è niente di simile in C#. Tutto lo stato che si desidera mantenere su più chiamate di metodo deve essere nei campi, sia di istanza che statici.

Tranne ... se si acquisisce la variabile in un'espressione lambda o qualcosa del genere. Per esempio:

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

    return() => count++; 
} 

Ora è possibile utilizzare:

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

Ora, naturalmente, si sta solo chiamando GetCounter() una volta, ma che "variabile locale" è certamente vive su ben oltre la durata si potrebbe avere atteso ...

Questo potrebbe essere o non essere di alcuna utilità per voi - dipende da cosa state facendo. Ma la maggior parte delle volte ha davvero senso che un oggetto abbia il suo stato nei campi normali.

+1

L'uso di una chiusura per simulare una variabile locale statica costituisce un codice malvagio? – sq33G

+0

@ sq33G: Dipende esattamente da come lo stai usando, penso ... –

1

dovreste creare una variabile membro statica o un'istanza della classe del metodo è in.

0
public class Foo 
{ 
    static int _bar = 1; 

    public int Bar() 
    { 
     return ++_bar; 
    } 
} 
Problemi correlati