2012-06-07 21 views
7

W C mogę zrobićCzy istnieje odpowiednik statycznego C w C#?

void foo() { 
    static int c = 0; 
    printf("%d,", c); 
    C++; 
} 

foo(); 
foo(); 
foo(); 
foo(); 

powinien wydrukować 0,1,2,3

Czy istnieje odpowiednik w C#?

+0

Ale chcę zrobić dokładnie w powyższym kodzie C. Jest to możliwe? – Jack

+1

nie, nie możesz mieć lokalnych zmiennych statycznych w języku C#. Mając zmienną klasy jest tak blisko, jak tylko można uzyskać – shf301

Odpowiedz

3

Coś jak:

class C 
{ 
    private static int c = 0; 
    public void foo() 
    { 
     Console.WriteLine(c); 
     c++; 
    } 
} 
+0

ooh pokonać mnie do punch .... –

+0

Tylko "sort", "c" jest widoczne dla wszystkich metod. –

+0

@ pst Nie sądzę, że istnieje sposób określania zmiennych statycznych w języku C# bez użycia wzorca wewnętrznego/zewnętrznego. –

2

W języku C# nie ma żadnych znaków globalnych, jednak można utworzyć pole statyczne w klasie.

public class Foo{ 
    private static int c = 0; 
    void Bar(){ 
     Console.WriteLine(c++); 
    } 
} 
+0

Tylko "sort", "c" jest widoczne dla wszystkich metod. –

+0

'WriteLine()' typ danych obiektu 'accpets '. Nie musisz konwertować go na ciąg. Wykonuj tylko: 'Console.WriteLine (C++);' –

+1

Uważam, że "członek" lub "pole" jest słowem, którego szukasz, a nie "stałym", ponieważ a) nie jest to celowe i b) prawdziwe stałe są deklarowane z 'const' zamiast' static', jak w 'private static const int Zero = 0'. – Ruben

2

nie można zrobić na poziomie metody. Najbliżej można zrobić na poziomie metody jest coś takiego, a to nie jest tak blisko. W szczególności działa tylko wtedy, gdy masz odniesienie do modułu wyliczającego. Jeśli ktoś inny zadzwoni tą metodą, nie zobaczy twoich zmian.

class Program { 
     static IEnumerable<int> Foo() { 
      int c = 0; 
      while (true) { 
       c++; 
       yield return c; 
      } 
     } 
     static void Main(string[] args) { 
      var x = Foo().GetEnumerator(); 
      Console.WriteLine(x.Current); //0    
      x.MoveNext(); 
      Console.WriteLine(x.Current); //1 
      x.MoveNext(); 
      Console.WriteLine(x.Current); //2 
      Console.ReadLine(); 
     } 
    } 

Co ciekawe, VB.NET obsługuje statyczne zmienne lokalne: http://weblogs.asp.net/psteele/pages/7717.aspx. Jak zauważa ta strona, sama platforma .NET nie obsługuje tego, ale kompilator VB.NET podrabia go, dodając statyczną zmienną poziomu klasy.

+1

Yikes! Zauważ też, że nie jest to bardzo globalne/statyczne, ponieważ będziesz musiał śledzić moduł wyliczający 'x' przez cały czas. Pole statyczne jest znacznie bliższe statycznej zmiennej w C, oprócz widoczności, która jest szersza w C# dla pola statycznego niż dla zmiennej statycznej w C. – Ruben

+0

Jestem tego świadomy :). Nie znam całego powodu, dla którego OP chciał zrobić coś podobnego, więc zawarłem to jedynie jako coś, na co on * może * chcieć spojrzeć. Sądzę, że powinienem usunąć, zanim będę bardziej doceniony. :) – aquinas

+1

Jeśli schodzę tą trasą, wolę raczej "normalne" zamknięcie, ale ciekawe podejście ... a ponieważ nie mówi "użyj statycznego członka", no, +1! –

3

Nie istnieje żaden sposób, aby osiągnąć ten sam zachowanie jako funkcja zmiennej statycznej c ...

3

Chociaż niektórzy sugerowali jako staticczłonkiem zmiennej, to nie jest to samo ze względu na widoczność. Jako alternatywnego do odpowiedzi przez Akwinu, jeśli zamknięcia są zaakceptowane, to można zrobić:

(Zauważ, że Foo jest aa nieruchomość a nie metoda i że c jest „za przykład .”)

class F { 
    public readonly Action Foo; 
    public F() { 
     int c = 0; // closured 
     Foo =() => { 
      Console.WriteLine(c); 
      c++; 
     }; 
    } 
} 

var f = new F(); 
f.Foo(); // 0 
f.Foo(); // 1 

Jednakże, C# ma bezpośredniego równoważność static zmiennej C

Szczęśliwe kodowanie.

Powiązane problemy