8

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#?

4

5 に答える 5

4

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

ハッピーコーディング。

于 2012-06-07T18:20:46.597 に答える
3

いいえ、静的 c 関数変数と同じ動作を実現する方法はありません ...

于 2012-06-07T18:09:27.343 に答える
3

何かのようなもの:

class C
{
    private static int c = 0;
    public void foo()
    {
        Console.WriteLine(c);
        c++;
    }
}
于 2012-06-07T17:50:56.087 に答える
2

メソッドレベルではできません。メソッド レベルで実行できる最も近いものは次のようなものですが、これは実際にはそれほど近いものではありません。特に、列挙子への参照がある場合にのみ機能します。他の誰かがこのメソッドを呼び出しても、変更は表示されません。

   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 コンパイラは静的なクラス レベル変数を追加することでこれを偽装しています。

于 2012-06-07T17:56:31.157 に答える
2

C# にはグローバルはありませんが、クラス内に静的フィールドを作成できます。

public class Foo{
    private static int c = 0;
    void Bar(){
       Console.WriteLine(c++);
    }
}
于 2012-06-07T17:50:50.217 に答える