2010-04-30 16 views
5

In VB6 gibt es lokale statische Variablen, die ihre Werte nach dem Beenden der Prozedur behalten. Es ist wie mit öffentlichen Variablen, aber auf lokalen Block. Zum Beispiel:VB6 private statische in C#?

sub count() 
static x as integer 
x = x + 1 
end sub 

Nach 10 Anrufen, wird x 10 sein Ich habe versucht, das Gleiche in .NET (und sogar Java) zu suchen, aber es gab keine. Warum? Wird das OOP-Modell in irgendeiner Weise durchbrochen, und gibt es eine Möglichkeit, dies zu emulieren?

Antwort

6

Die nächstgelegene Sie bekommen kann, ist ein statisches Feld außerhalb die Methode:

private static int x; 
public [static] void Foo() { 
    x++; 
} 

Closure Beispiel wie gewünscht:

using System; 
class Program { 
    private static readonly Action incrementCount; 
    private static readonly Func<int> getCount; 
    static Program() { 
     int x = 0; 
     incrementCount =() => x++; 
     getCount =() => x; 
    } 
    public void Foo() { 
     incrementCount(); 
     incrementCount(); 
     Console.WriteLine(getCount()); 
    } 
    static void Main() { 
     // show it working from an instance 
     new Program().Foo(); 
    } 
} 
+2

Die Verwendung des statischen Konstruktors zum Initialisieren eines Delegate-Felds mit einem Closure liegt wahrscheinlich etwas näher beim Zugriff auf die Variable (im Gegensatz zum statischen Feld wird es nicht durch Reflektion der Klasse oder durch andere Klassenmethoden sichtbar) –

+0

@Ben - interessanter Ansatz, aber viel zusätzliche Komplexität - Menschen zu verstehen, gefangen Variablen ist schwierig zu den besten Zeiten; -p –

+1

OK, ich verstehe es, aber * warum *? Unterbricht es OOP in irgendeiner Weise? – blez

0

Sie immer statische Variablen in einer Klasse verwenden können, zu diesem Zweck:

class C 
{ 
    static int x=0; 

    void count() 
    { 
    ++x; // this x gets incremented as you want 
    } 
} 
0

Ich erinnere mich an statische private in Visual Basic. Sie waren cool für eine bestimmte Aufgabe.

Keine solche Sache in .net. Sie müssen mit statischen außerhalb des Metod bleiben.

+1

Es gab einige coole Dinge in VB6 in der Tat. – blez

+2

Nun, sie sind in VB.NET verfügbar (aber nicht C#) ... Wenn Sie Static etwas als Integer innerhalb einer Methode deklarieren, wird es wie in VB6 verhalten. –

0

Oft werden diese Arten von Variablen verwendet, um Iteratoren zu pflegen. In C# sind diese über das Schlüsselwort yield direkt in die Sprache integriert. Hier ein Beispiel:

IEnumerable<int> TimesTable(int table) 
{ 
    for (int i=0 ; i<12 ; i++) 
    { 
     yield return i * table; 
    } 
} 

In diesem Beispiel legen wir die Werte in der n-mal-Tabelle, wobei n vom Anrufer angegeben wird. Damit können wir überall ein Iterator verwendet wird, wie in einer foreach Schleife:

foreach (var value in TimesTable(3)) 
{ 
    Console.Write(""+ value + " "); 
} 

..., die erzeugt:

3 6 9 12 15 18 21 24 27 30 33 36 

In C++, das ist wie die, die statischen Variablen verwendet haben, könnten Sie beschrieben von VB (ich bin kein VB Kerl, damit ich die VB-Syntax nicht kennen):

int TimesTable(int table) { 
    static i = 1; 
    if (i == 12) { 
     i = 1; 
    } 
    return i++ * table; 
} 

die C# Version ist besser als die C++ (oder VB) äquivalent becuase der Iterator Ohr abgebrochen werden kann Es können mehrere Iteratoren gleichzeitig aktiv sein. Diese Dinge gelten nicht für die C++ - Version ohne mehr Arbeit vom Entwickler. Auf der anderen Seite bedeutet dies, dass nur eine statische Variable in C# während einer Iteratorimplementierung gültig ist und der Wert nicht über diesen Bereich hinaus erhalten bleibt.

Ich hoffe, dass das für Sie von Nutzen ist.

+0

Ja, ich bin mir der Iteratoren bewusst, aber das ist nicht das Besondere, was ich brauche, jedenfalls, danke. – blez