我可以访问其他用户使用的相同静态方法吗?

时间:2011-11-21 09:00:30

标签: c# asp.net methods static

我在C#上有这个静态方法:

public class MyClass
{
    public MyClass()
    {

    }

    public static void myOwnMethod(int myValue)
    {
        int internalValue;
        internalValue=myValue+10;
        Console.Write(internalValue);
    }
}

现在,如果用户A调用MyClass.myOwnMethod(),用户B是否可以调用用户A调用的相同方法(静态),或者用户B调用该方法时是否要创建类/方法的另一个“实例”?

因为可能有危险的静态方法所以......

实施例

  • userA调用MyClass.myOwnMethod(10);
  • 如果同时userA userB的Console.Write调用MyClass.myOwnMethod(20),这是每个用户的结果吗?

userA获得20而userB 30或两者都获得30?

7 个答案:

答案 0 :(得分:3)

  

如果用户A调用MyClass.myOwnMethod(),用户B可以调用相同的方法

是的,当然。

但究竟发生了什么取决于。你的'用户'线程是他们运行程序的单独实例吗?

更新后

当您在服务器应用程序中为2+用户(请求)调用静态方法时,该方法的内部应该是线程安全的。在这个例子中是因为

  • internalValue是一个局部变量
  • Console.Write()在设计上是线程安全的。

但是在“真实”的情况下,您会想要使用共享(静态)数据,然后您需要某种形式的锁定。

答案 1 :(得分:1)

是的,这是可能的。您应该避免以这种方式使用静态方法。我自己在登录课上犯了这个错误,我的同事接管了我的用户档案。

只要您确定数据对象/类不是静态的,您就可以使用类静态

答案 2 :(得分:1)

静态方法适用于Type而不是实例。所以,是的,任何用户都可以调用你的静态myOwnMethod()。

答案 3 :(得分:1)

您尚未提及如何访问这些方法,但静态方法不会重复,因此两个用户都将调用完全相同的代码。由开发人员来防止可能由此引起的竞争条件。

请阅读MSDN上的What Every Dev Must Know About Multithreaded Apps以了解有关我的意思的更多信息。我保证你绝对值得阅读这篇文章。

答案 4 :(得分:1)

我不知道你说用户A和用户B是什么意思?

就多线程而言:一次可以由多个线程调用静态方法。我想这就是你在说的。

在调用静态方法时,Ther不涉及类实例。

您必须以线程安全的方式在方法中编写代码:重要的是同步对全局或静态数据的访问。

答案 5 :(得分:1)

对于你的问题:是的,任何人都可以同时调用静态方法

对于您的示例:在您当前的情况下,userA和userB将获得结果作为其方面

但是如果你的方法的参数是对象类型,我不能这么说。也许它不是线程安全的

答案 6 :(得分:1)

它完全取决于用户A和用户B的类的范围。如果用户A和用户B在进程中使用静态方法,是的,他们共享该方法。但是,如果他们将共享类用于不同的进程,否则静态方法将不会被共享。