【问题标题】:Can I access to the same static method used by another user?我可以访问其他用户使用的相同静态方法吗?
【发布时间】:2012-01-02 19:23:15
【问题描述】:

我在 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?

【问题讨论】:

  • Winforms?网络表格?用户是否使用相同的程序实例?
  • 如何限制用户?我根本看不到如何阻止用户调用您的代码。
  • 请解释一下本文中的“用户”是什么。
  • 添加示例或我的意思!也许更清楚:)
  • @Oded :我从 aspx.cs(Web 应用程序)调用这些方法

标签: c# asp.net methods static


【解决方案1】:

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

是的,当然。

但究竟会发生什么取决于。是您的“用户”线程还是它们运行程序的单独实例?

更新后

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

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

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

【讨论】:

  • 是的,但是如果在方法内部我使用非静态对象,userB 不应该与 userA 交互,对吧?这就是我需要的……!
  • 取决于如何你与那个非静态的东西交互。非常多的可能性。
【解决方案2】:

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

只要确保数据对象/类不是静态的,您就可以将类设为静态

【讨论】:

  • 添加了我的意思的目标!看看
【解决方案3】:

静态方法作用于类型而不是实例。所以是的,任何用户都可以调用您的静态 myOwnMethod()。

【讨论】:

    【解决方案4】:

    您没有提到您是如何访问这些方法的,但是静态方法不会重复,因此两个用户将调用完全相同的代码。开发人员有责任防止由此可能导致的竞争条件。

    请阅读 MSDN 上的 What Every Dev Must Know About Multithreaded Apps 以进一步了解我的意思。我向你保证,这篇文章绝对值得一读。

    【讨论】:

      【解决方案5】:

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

      在多线程方面:一个静态方法可以同时被多个线程调用。我想这就是你所说的。

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 最后一步没看懂。当然,如果我传递静态对象,他们将编辑同一个对象......但是如果我传递新对象(或者我将新对象实例化到方法中),他们将无法访问同一个对象。 (以 int internalValue 为例)...
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-04
          • 1970-01-01
          • 1970-01-01
          • 2017-01-01
          • 1970-01-01
          • 2022-06-25
          • 2012-04-28
          相关资源
          最近更新 更多