在C中,我可以做到
void foo() {
static int c = 0;
printf("%d,", c);
c ++;
}
foo();
foo();
foo();
foo();
它应该打印0,1,2,3
C#中是否有等价物?
答案 0 :(得分:3)
类似的东西:
class C
{
private static int c = 0;
public void foo()
{
Console.WriteLine(c);
c++;
}
}
答案 1 :(得分:3)
没有办法实现与静态c函数变量相同的行为......
答案 2 :(得分:3)
虽然有些人建议使用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
变量。
快乐的编码。
答案 3 :(得分:2)
C#中没有全局变量,但是,您可以在类中创建静态字段。
public class Foo{
private static int c = 0;
void Bar(){
Console.WriteLine(c++);
}
}
答案 4 :(得分: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编译器通过添加静态类级变量来伪造它。