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.
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) –
@Ben - interessanter Ansatz, aber viel zusätzliche Komplexität - Menschen zu verstehen, gefangen Variablen ist schwierig zu den besten Zeiten; -p –
OK, ich verstehe es, aber * warum *? Unterbricht es OOP in irgendeiner Weise? – blez