【问题标题】:Is there an equivalent to static of C in C#?在 C# 中是否有相当于 C 的静态?
【发布时间】:2012-06-07 17:47:54
【问题描述】:

在 C 中我可以做到

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

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

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

C# 中是否有等价物?

【问题讨论】:

  • 但我想在上面的代码 C 中准确地做。有可能吗?
  • 不,你不能在 C# 中使用局部静态变量。拥有一个类变量是尽可能接近的

标签: c# c static


【解决方案1】:

虽然有些人建议使用 static member 变量,但由于可见性,这并不相同。作为 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 变量。

编码愉快。

【讨论】:

    【解决方案2】:

    类似:

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

    【讨论】:

    • 只有“排序”,c 对所有方法可见。
    • @pst 我不认为有一种方法可以在不使用内部/外部模式的情况下在 c# 中确定静态变量的范围。
    • @aleroot 当然不一样,因为这种声明在 C# 中根本不存在。这是最接近的。
    • 是的,但问题是:在 C# 中是否有与 C 的静态等效? --- 答案:没有
    • 我不得不给 -1 因为没有谈论这在答案中是如何不一样的。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 只有“排序”,c 对所有方法可见。
      • WriteLine() accpets object 数据类型。您不需要将其转换为字符串。只做:Console.WriteLine(c++);
      • 我认为“成员”或“字段”是您要查找的词,而不是“常量”,因为 a)这不是故意的常量,并且 b)真正的常量用 @ 声明987654326@ 而不是static,如private static const int Zero = 0。
      • @pst 您不能将静态字段限定为方法。这是您将得到的最接近的。通过将字段设为私有,您至少可以将其范围限定为当前类。
      • @Ruben,你说得对,我想我只是脑子有问题。 @TheMask,我只是习惯了""+object 作为toString() 的调用者。个人喜好,我猜。
      【解决方案5】:

      您不能在方法级别上做到这一点。您可以在方法级别上做的最接近的事情是这样的,但这并不是那么接近。特别是,它仅在您引用枚举器时才有效。如果其他人调用此方法,他们将看不到您的更改。

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

      【讨论】:

      • 哎呀!另请注意,这并不是非常全局/静态的,因为您需要一直跟踪枚举器 x。静态字段更接近 C 中的静态变量,除了可见性之外,在 C# 中静态字段比 C 中的静态变量更广泛。
      • 我知道 :)。我不知道 OP 想要做这样的事情的全部原因,所以我只是把它作为他可能想看的东西。我想我应该在被更多人否决之前删除。 :)
      • 如果沿着这条路线走,我宁愿使用“普通”闭包,但这是一种有趣的方法......因为这并没有说“使用静态成员”,好吧,+1!
      猜你喜欢
      • 1970-01-01
      • 2021-10-09
      • 2010-11-19
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多