0

堆栈溢出。假设我要初始化一个非静态变量类,其中两个是 UserID (int) 和 MyDictionary (Dictionary)。这个非静态类在静态类中声明(并在静态类的成员之一中初始化)。如果脚本运行时间较长并且另一个用户访问同一页面,则新用户可能会更改另一个用户的 MyDictionary 的内容。但我不明白这是怎么可能的,因为 MyDictionary 是在一个非静态类中。有人明白这个吗?谢谢你。

4

3 回答 3

1

所以我假设代码看起来有点像这样,对吧?

public class MyNonStaticClass
{
    public int UserID;

    public Dictionary<int, string> MyDictionary 
        = new Dictionary<int, string>;
}

public static class MyStaticClass
{
    public static MyNonStaticClass aStaticInstanceOfTheNonStaticClass 
        = new MyNonStaticClass();

    public static void AddToDictionary(int key, string value)
    {
        aStaticInstanceOfTheNonStaticClass.add(key, value);
    }
}

通过将静态类中的对象声明为静态变量,您基本上是在说“在我的应用程序中,我想要其中之一;并且只有其中之一”;所以即使类不是静态的;您仍在创建它的静态实例。

于 2012-04-10T22:43:16.443 回答
1

静态性(或缺乏静态性)不会影响线程安全。静态只是意味着类成员(属性、字段、方法或构造函数)与类型相关联,而不是与类的特定实例相关联。

我可以编写非线程安全的静态代码(如您在问题中描述的代码),我可以编写线程安全的实例代码,反之亦然。这是一些非线程安全(坏)的代码,或多或少与我认为您正在做的事情一致:

public static class MyFoo {

    // Just because this is a static property doesn't
    // mean the contained dictionary is thread safe!
    public static Dictionary<String, String> MyDictionary { get; set; }

    public static MyFoo() {
        MyDictionary = new Dictionary<String, String>();
    }
}

如果您需要在 ASP.NET 中存储特定于用户的信息,请使用 Session 对象或(对于长期存在的数据)数据库。永远不要依赖静态变量——如果两个用户同时在网站上怎么办?

于 2012-04-10T22:41:03.327 回答
0

因为包含类和访问成员是静态的,所以它使用单一的内存空间。您必须假设静态类的引用(在这种情况下为局部变量、字段或属性)也是静态的(即使它们是非静态类的实例)。

首先这个类是静态的原因是什么?如果您使用共享逻辑,为什么不通过引用静态方法来传递字典?

于 2012-04-10T22:39:56.907 回答