静态方法内的变量共享

时间:2010-08-03 19:08:29

标签: c# static-methods local-variables

我对静态方法中的变量有疑问。 静态方法中的变量是共享相同的内存位置还是它们具有单独的内存?

这是一个例子。

public class XYZ
{
    Public Static int A(int value)
    {
      int b = value;
      return b;
    }
}

如果3个不同的用户调用执行方法A

XYZ.A(10);
XYZ.A(20);
XYZ.A(30);

同时。每次通话的回报值是什么?

XYZ.A(10)=?
XYZ.A(20)=?
XYZ.A(30)=?

4 个答案:

答案 0 :(得分:15)

它们仍然是局部变量 - 它们不在线程之间共享。他们在静态方法中的事实没有任何区别。

如果您使用 static 变量作为中间变量,不安全:

public class XYZ
{
    // Don't do this! Horribly unsafe!
    private static int b;
    public static int A(int value)
    {
        b = value;
        return b;
    }
}

这里,所有线程都真正使用相同的b变量,因此如果您同时从多个线程调用该方法,则线程X可以写入b,然后是线程Y,这样线程X最终返回线程Y设置的值。

答案 1 :(得分:4)

线程不会覆盖彼此的值,因为变量完全在堆栈上。每个线程都有一个单独的堆栈。

答案 2 :(得分:1)

这不是一个线程安全的方法,但是所有自动变量都是自动线程安全的,因为无论何时调用该函数,您都会得到一个新的堆栈帧。所有本地人在进入该功能时创建,并在退出时销毁。如上所述,如果你使用过静态存储,那么你会得到意想不到的结果。

答案 3 :(得分:1)

不,他们在内存中没有共享相同的空间。对于您的通话,他们会返回(按您列出的顺序):102030

老实说,使用你的代码在任何情况下都是如此(因为你只是分配一个值,而不是用它做任何事情)但是考虑一下:

Class XYZ
{
   public static int A (int value)
   {
      b += value;  \\Won't compile: b not initialized
      return b;
   }
}

或者

Class XYZ
{
   public static int A (int value)
   {
      int b = 0;  \\Initialized 'b' for each call
      b += value;  
      return b;
   }
}

由于静态方法无法访问实例变量(至少,没有对实例的引用),因此无法在每次调用代码时重新初始化静态方法中的变量一次。要允许静态方法更改变量,您需要传入两个值以便相互操作。