静态变量和静态方法的区别

3
我知道当你使用静态变量时,它的值将在所有用户之间共享。
static string testValue = "";
protected void SomeMethod(object sender, EventArgs e)
{
    testValue = TextBox1.Text;        
    string value = TestClass.returnString(TextBox1.Text); // <-- return from a static method
}

在这种情况下,如果一个用户进入网站并将信息输入到文本框中,当另一个用户输入信息时,字符串testValue会被覆盖。(我想是这样的?)

现在我有了这个类:

public class TestClass
{
  public static string returnString(string msg)
  {
    return msg;
  }
}

我的问题是:如果我使用一个静态方法,那么该方法的返回值是否也被共享给所有用户?或者每个用户始终都有一个“唯一”的值?

假设这个方法被五个不同的用户调用了五次,那么这个静态方法会返回某个特定用户输入的值,还是可能会出现一个用户得到另一个用户输入的值的情况?


1
在你的例子中,返回值将对每个调用者都是“唯一”的,这意味着如果每个调用者使用不同的参数值调用静态方法,他们将会得到他们所调用函数的值,而不可能返回另一个调用者的值。 - Monroe Thomas
8个回答

5

您的问题是:

如果我使用静态方法,该方法的返回值是否对所有用户共享?还是每个用户都有独特的值?

答案是:这取决于情况。以您的示例为例:

public class TestClass 
{ 
  public static string returnString(string msg) 
  { 
    return msg; 
  } 
}

在这种情况下,5个不同的用户(很可能)会向静态方法传递5个不同的字符串。因此,他们将得到五个不同的字符串。因此,在这种情况下:
string value = TestClass.returnString(TextBox1.Text);

每个用户将会得到他们自己在文本框中输入的内容。然而,如果代码是这样的:

string value = TestClass.returnString(testValue);

当方法返回时,所有用户都将获取静态字符串中存在的内容。

因此,需要记住以下规则:

  • 如果该方法使用静态成员变量,则不同用户之间会互相影响结果。无论该方法是否为静态方法都是如此。
  • 如果该方法仅使用调用参数和局部变量,并且调用参数本身未指向静态成员变量,则来自不同用户的调用不会互相影响。

2
一个静态方法不与特定对象绑定,而是与类绑定。您不需要 TestClass 的实例来调用在您的类中声明的静态函数。因此,静态函数不能使用类的非静态成员,因为它们与类的特定实例绑定。
事实上,对于静态变量也是如此。静态变量不与特定对象绑定,而是与类绑定。如果一个对象更改了该变量,则所有对象都会更改,因为它只存在一次。

2
我的问题是,如果我使用静态方法,该方法的返回值是否也会共享给所有用户?还是说每个用户都有一个独特的返回值?
静态变量在应用程序域内共享。Web 服务器可能同时运行多个实例,并在多个用户之间共享它们,因此您不能依赖它。
每个用户一个实例:如果要维护每个用户的唯一值,请使用会话变量。
所有用户一个实例:共享真正单个唯一变量实例并非易事,请考虑使用数据库来确保所有用户获取相同的值。

1
一个静态方法或变量总是通过类本身可用,并不仅限于该类的实例。

1
如果静态方法不使用共享资源,多个调用者同时访问它时就不会出现问题。只要该方法没有将“共享对象”作为参数传递(这意味着每个调用者都有自己的传递参数的实例),并且静态方法本身不使用任何共享资源(变量/对象等...这些资源在静态方法之外范围内),那么每个调用者都像拥有自己的方法副本一样运行该方法,因为他们都在自己的线程上运行该方法。
然而,如果静态方法使用共享对象或资源(例如在其他地方定义的静态对象),多个调用者可能会相互干扰,因此您需要在静态方法中添加某种锁定来处理这种情况。在这种情况下,除非您添加自己的逻辑来处理多个线程同时访问它,否则静态方法将不是线程安全的。

0
据我了解,如果有5个用户从5个不同的位置或5台不同的计算机登录到网站上,这个值不会共享。它只会为来自一个PC的一个用户共享。
您可以假设每个浏览器都运行应用程序的单独副本。静态变量在应用程序之间不共享,但在应用程序内部共享。

0

你只是返回作为参数传递的变量,所以你的问题没有意义。

每个方法调用都会将另一个变量作为参数,然后返回该变量,那么如何在所有用户之间共享该变量呢?


0
请不要依赖静态变量,但当需要获取一个对象的单个实例时,通常使用静态方法,例如HttpContext。

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