8

在CI可以做

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

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

它应该打印0,1,2,3

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#没有直接等效static于 C 中的变量。

快乐编码。

于 2012-06-07T18:20:46.597 回答
3

就像是:

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

不,没有办法实现与静态 c 函数变量相同的行为......

于 2012-06-07T18:09:27.343 回答
2

C# 中没有全局变量,但是,您可以在类中创建静态字段。

public class Foo{
    private static int c = 0;
    void Bar(){
       Console.WriteLine(c++);
    }
}
于 2012-06-07T17:50:50.217 回答
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 回答