In C I can do
void foo() {
static int c = 0;
printf("%d,", c);
c ++;
}
foo();
foo();
foo();
foo();
it should print 0,1,2,3
Is there an equivalent in C#?
static
メンバー変数として提案されているものもありますが、これは可視性のために同じではありません。aquinas による回答の代わりに、クロージャーが受け入れられた場合、これを行うことができます。
(これFoo
はメソッドではなくプロパティであり、 「インスタンスごと」であることに注意してください。)c
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
ただし、C# には、Cの変数に直接相当するものはありません。static
ハッピーコーディング。
いいえ、静的 c 関数変数と同じ動作を実現する方法はありません ...
何かのようなもの:
class C
{
private static int c = 0;
public void foo()
{
Console.WriteLine(c);
c++;
}
}
メソッドレベルではできません。メソッド レベルで実行できる最も近いものは次のようなものですが、これは実際にはそれほど近いものではありません。特に、列挙子への参照がある場合にのみ機能します。他の誰かがこのメソッドを呼び出しても、変更は表示されません。
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();
}
}
興味深いのは、VB.NET が静的ローカル変数をサポートしていることです: http://weblogs.asp.net/psteele/pages/7717.aspx。このページに記載されているように、.NET 自体はこれをサポートしていませんが、VB.NET コンパイラは静的なクラス レベル変数を追加することでこれを偽装しています。
C# にはグローバルはありませんが、クラス内に静的フィールドを作成できます。
public class Foo{
private static int c = 0;
void Bar(){
Console.WriteLine(c++);
}
}