【问题标题】:difference between static variables and static methods静态变量和静态方法的区别
【发布时间】:2012-07-09 20:50:24
【问题描述】:

我知道,当您使用静态变量时,它的值会在所有用户之间共享。

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;
  }
}

我的问题是:如果我使用静态方法,该方法的返回值是否也为所有用户共享?还是每个用户总是一个“独特”的价值?

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

【问题讨论】:

  • 在您的示例中,每个调用者的返回值都是“唯一的”,因此如果每个调用者使用不同的参数值调用静态方法,它们都将返回他们调用的值函数,而不可能返回另一个调用者的值。

标签: c# asp.net webforms


【解决方案1】:

你的问题是:

我现在的问题是,如果我使用静态方法,返回值是 该方法也为所有用户共享?还是那总是一个“独特的” 每个用户的价值?

答案是,视情况而定。使用您的示例:

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

在这种情况下,5 个不同的用户将(很可能)将 5 个不同的字符串传递给静态方法。因此他们会得到五个不同的字符串。所以对于这种情况:

string value = TestClass.returnString(TextBox1.Text);

每个用户都可以取回他们在自己的 TextBox 中输入的任何内容。另一方面,如果代码是这样的:

string value = TestClass.returnString(testValue);

他们都会取回返回时静态字符串中发生的事情。

所以要记住的规则是:

  • 如果方法使用静态成员变量,则存在不同用户影响彼此结果的风险。无论方法是否为静态,这都是真的。
  • 如果方法只使用调用参数和局部变量,并且调用参数本身不指向statisc成员变量,不同用户的调用不会相互影响。

【讨论】:

    【解决方案2】:

    静态方法不绑定到特定对象,而是绑定到类。您不需要TestClass 的实例来调用在您的类中声明的静态函数。因此,静态函数不能使用类的非静态成员,因为它们绑定到类的特定实例。

    事实上,静态变量也是如此。静态变量不绑定到特定对象,而是绑定到类。如果一个对象更改了变量,则所有对象都会更改,因为它只存在一次。

    【讨论】:

      【解决方案3】:

      静态方法或变量始终通过类本身可用,并且不仅绑定到此类的实例。

      【讨论】:

        【解决方案4】:

        我现在的问题是,如果我使用静态方法,返回值是 该方法也为所有用户共享?还是那总是一个“独特的” 每个用户的价值?

        静态变量在应用程序域内共享。 Web 服务器可以并行运行多个实例,在多个用户之间共享它们,因此您不能依赖它。

        每个用户一个实例:如果您想保持每个用户的唯一值,请使用会话变量。

        一个实例供所有用户使用:在多个用户之间共享一个真正唯一的唯一变量实例并非易事,考虑使用数据库来确保所有用户都获得相同的值。

        【讨论】:

          【解决方案5】:

          如果静态方法不使用共享资源,那么多个调用者同时点击它不会有问题。因此,只要该方法没有作为参数传递“共享对象”(意味着每个调用者都有自己的传递参数的实例),并且静态方法本身不使用任何共享资源(变量/对象等)。 ..在静态方法之外),就好像每个调用者都有自己的方法副本,因为他们每个人都在自己的线程上运行该方法。

          但是,如果静态方法使用共享对象或资源(例如在别处定义的静态对象),则多个调用者可能会互相踩踏,因此您需要在静态方法中进行某种锁定来处理这种情况。在这种情况下,静态方法将不是线程安全的,除非您添加自己的逻辑来处理多个命中它的线程。

          【讨论】:

            【解决方案6】:

            据我了解,从 5 个不同位置或从 5 台不同计算机登录到该站点的 5 个用户,该值不会被共享。它只会在一台 PC 上为一位用户共享。

            您可以假设每个浏览器都运行应用程序的单独副本。静态变量不在应用程序之间共享,而是在应用程序内共享。

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

                请不要依赖静态变量,但通常在需要获取 objetc 的单个实例时使用静态方法,例如 HttpContext

                【讨论】:

                  猜你喜欢
                  • 2020-07-13
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-04-23
                  • 2013-07-21
                  • 1970-01-01
                  • 2011-07-11
                  • 2016-07-26
                  • 2012-05-14
                  相关资源
                  最近更新 更多