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

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

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将被另一个值覆盖。 (我认为?)

我现在有这个class:

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

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

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

你的问题是:

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

答案是,这取决于。 使用你的例子:

 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成员变量,则来自不同用户的调用不会相互影响。

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

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

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

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

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

每个用户一个实例 :如果要为每个用户维护唯一值,请使用会话变量。

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

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

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

据我所知,从5个不同的位置或从5台不同的计算机登录到该站点的5个用户将不会共享此值。 它只能由一台PC共享一个用户。

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

您只是返回已作为参数传递的变量,因此您的问题没有意义。

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

请不要依赖静态变量,但是当需要获取一个obumec示例的单个实例时,通常会使用静态方法HttpContext