2011-12-14 8 views
11

Oznacza to, że w języku C, możemy zdefiniować funkcję jak:Czy istnieje słowo kluczowe w języku C#, które spowodowałoby, że zmienne lokalne pozostałyby w wielu połączeniach?

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

i zwróci większą liczbę za każdym razem, to jest tzw. Czy istnieje odpowiednik słowa kluczowego w języku C#?

+0

C został wynaleziony podczas wątków jeszcze nie istnieje. Podobnie jak Visual Basic, musieli go zaimplementować w vb.net. Ilość kodu, który musi wygenerować, aby była bezpieczna dla wątków i wyjątków, jest całkiem spora. –

+0

Bardzo dobre pytanie –

Odpowiedz

17

Nie, nie ma czegoś takiego w języku C#. Wszystkie stany, które chcesz utrwalić w wielu wywołaniach metod, muszą znajdować się w polach, instancji lub statycznych.

Z wyjątkiem ... jeśli przechwycisz zmienną w wyrażeniu lambda lub coś w tym stylu. Na przykład:

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

    return() => count++; 
} 

Teraz można użyć:

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

Teraz oczywiście jesteś tylko nazywając GetCounter() raz, ale że „zmienna lokalna” jest z pewnością żyje na znacznie poza życiu mogłeś oczekiwano ...

To może, ale nie musi być dla ciebie przydatne - to zależy od tego, co robisz. Ale większość czasu ma sens, gdy obiekt ma swój stan w normalnych polach.

+1

Czy użycie zamknięcia do symulacji statycznej zmiennej lokalnej stanowi zły kod? – sq33G

+0

@ sq33G: To zależy od tego, jak go używasz, myślę ... –

1

Trzeba by stworzyć statyczne lub instancji zmiennej członkiem klasy metoda znajduje.

0
public class Foo 
{ 
    static int _bar = 1; 

    public int Bar() 
    { 
     return ++_bar; 
    } 
} 
Powiązane problemy