2012-04-10 56 views
0

堆栈溢出。假设我想初始化一个非静态类变量,其中两个是UserID(int)和MyDictionary(Dictionary)。这个非静态类是在静态类中声明的(并且在静态类的成员之一中初始化)。 如果脚本运行时间过长而另一用户访问同一页面,则新用户有可能会改变其他用户的MyDictionary的内容。但我不明白这是如何可能的,因为MyDictionary是在一个非静态类。有没有人明白这一点?谢谢。在静态类中的ASP.NET非静态类Thread-Safety

+0

你从哪里得到它的一个用户将能够修改其他人使用的服务器端的东西?如果我没有弄错的话,服务器为每个用户提供独立的线程和内存。另外,我建议您将所有课程放在单独的文件中,除非您的私人课程仅用于一个班级。 – MarioDS 2012-04-10 22:40:18

回答

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

通过声明静态类内的对象作为一个静态变量,你基本上是说“在我的应用我想其中的一个;而只有其中一个”;所以即使班级不是静态的,你仍然在创建一个静态实例。

+0

男人,我想了一个小时左右,你的答案证实了这一点。谢谢。 – user1325179 2012-04-10 23:53:37

0

因为包含类和访问成员是静态的,所以它使用单一的内存空间。你必须假定静态类的引用(本例中为本地,字段或属性)也是静态的(即使它们是非静态类的实例)。

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

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中使用会话对象或(对于更长寿命的数据)数据库。永远不要依赖静态变量 - 如果两个用户同时在网站上,该怎么办?