C#中是否有C语言中的静态变量等价物?

8

在C语言中,我可以做到:

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

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

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

C# 中有类似的功能吗?


但是我想要像上面的C代码一样做,这是可能的吗? - Jack
1
不,你不能在C#中使用局部静态变量。拥有一个类变量是你能够接近的最好选择。 - shf301
5个回答

4

虽然有人建议使用静态 成员变量,但由于可见性不同,这并不相同。作为 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变量等同物。
编码愉快。

3

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


注:该句话涉及IT技术相关内容,暂无法确定具体领域和更加精确的翻译。

3

类似如下:

class C
{
    private static int c = 0;
    public void foo()
    {
        Console.WriteLine(c);
        c++;
    }
}

只有“sort of”,c 对所有方法都是可见的。 - user166390
@pst 我认为在C#中没有一种不使用内部/外部模式来限定静态变量作用域的方法。 - Hans Z
1
@aleroot 当然不一样,因为在C#中根本不存在这种声明方式。不过这是你能得到的最接近的方式了。 - Ruben
3
是的,但问题是:C#中是否有与C的静态等效物?---答案:没有。 - aleroot
我不得不给出-1的评分,因为回答中没有提到这个问题并且解释了这个问题与之前不同的地方。 - user166390

2

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

public class Foo{
    private static int c = 0;
    void Bar(){
       Console.WriteLine(c++);
    }
}

WriteLine() 接受 object 数据类型。您不需要将其转换为字符串。只需执行:Console.WriteLine(c++); - The Mask
1
我认为你要找的词是“成员”或“字段”,而不是“常量”,因为a)这并非故意设置为常量,b)真正的常量是用const而不是static声明的,例如private static const int Zero = 0 - Ruben
@pst 你不能将静态字段限定到方法中。这是你最接近的方法了。通过将该字段设置为私有,至少可以将其限定在当前类中。 - Ruben
@pst:在C语言中,变量c只能在它声明的作用域内可见。 - Jack
@Jack..这正是为什么它是“有点儿”答案的原因 :) - user166390
显示剩余3条评论

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编译器通过添加静态类级别变量来模拟它。

1
哎呀!请注意,这并不是真正的全局/静态,因为您需要一直跟踪枚举器“x”。静态字段与C中的静态变量非常接近,除了可见性在C#中对于静态字段比C中的静态变量更广泛。 - Ruben
我知道的:)。我不知道OP想要做这样事情的完整原因,所以我只是把它作为他可能想要查看的内容之一。我猜在我被投票降低之前,我应该删除它。:) - aquinas
1
如果选择这条路线,我宁愿使用一个“普通”的闭包,但这是一个有趣的方法... 因为这并没有说“使用静态成员”,所以加一分! - user166390

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接