【问题标题】:c#: static variable in a static methodc#:静态方法中的静态变量
【发布时间】:2011-05-30 08:47:23
【问题描述】:

你可以在静态方法中有一个静态变量吗?该变量的值是否会在对该方法的所有调用中保留?

例如。

public static void MyMethod()
{
    static int x = 0;
    x++;
}

【问题讨论】:

  • 您问是因为您之前在 VB.NET 中使用过 Shared 局部变量吗?在任何情况下,CLR 本身都不支持这一点,VB.NET 必须使用一些幕后技巧来创建这种效果。
  • 你需要的是一个静态类成员
  • @Colin - 我认为他希望 x 只能由 MyMethod() 访问,而不是由任何其他方法访问,无论它们是否属于此类。
  • 任何人都知道这在 7 年内是否发生了变化。我隐约记得这要么是新功能,要么可能是新功能。

标签: c# static


【解决方案1】:

没有。

你不能有局部静态变量。

来自MSDN

C# 不支持静态局部变量(在方法范围内声明的变量)。

还有here:

静态修饰符可以与类、字段、方法、属性、运算符、事件和构造函数一起使用,但不能与索引器、析构函数或类以外的类型一起使用。

如您所见,没有提及局部变量。


可以,但是使用静态字段:

public class MyClass
{
    private static int MyVariable = 10;

    public static void MyMethod()
    {
        MyVariable++;
    }
}

【讨论】:

  • 不幸的是,如果MyVariable 只在MyMethod 中使用,它属于MyMethod,不会暴露给类的其余部分。
  • 这可能是使用 C# 来支持较旧的“C”语言的唯一缺点。 C++ 作用域较弱,但您可以使用局部静态变量。这就是使strtok 功能成为可能的原因。来自 POSIX strtok 页面:此函数使用静态存储来跟踪调用之间的当前字符串位置。我用 C++ 编写了它的一个变体,它忽略了空记录并接受任何可以由 C++ String 类表示的分隔符。知道这些东西是如何工作的应该可以使它在任何语言中都可以复制,但是,这是 C# 的一个弱点。
  • @JoelTrauger C++ 的作用域规则到底如何比 C# 弱?据我所知,它们是相同的,除了 C++ 可能有局部静态变量。
  • IIRC,在 C++ 中,您已经显式调用继承来获得类的属性。任何没有通过继承显式传递的东西都是自动私有的。在 C# 中,只需将类设为公共,您就会自动继承该类的所有公共成员。 C# 还允许内部作用域进一步控制类成员的作用域。因此,我认为 C++ 作用域较弱,尽管其他人可能会发现它更强......因为 C# 中不存在静态变量。
【解决方案2】:

不,但你可以:

private static int x = 0;
public static void MyMethod()
{
     x++;
} 

【讨论】:

  • 如果你这样做,我想你会最想要[ThreadStatic]private static int x = 0;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2015-02-18
  • 1970-01-01
  • 2015-07-22
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多