Stack Overflow。假设我想初始化一个非静态变量类,其中两个是UserID(int)和MyDictionary(Dictionary)。这个非静态类在静态类中声明(并在其中一个静态类的成员中初始化)。 如果脚本运行时间较长而另一个用户访问同一页面,则新用户可能会更改其他用户的MyDictionary的内容。但我不知道这是怎么可能的,因为MyDictionary属于非静态类。有谁理解这个?谢谢。
答案 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中存储特定于用户的信息,请使用Session对象或(对于寿命更长的数据)数据库。不要依赖静态变量 - 如果两个用户同时在网站上会怎么样?
答案 1 :(得分: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);
}
}
通过将静态类中的对象声明为静态变量,您基本上是在“在我的应用程序中我想要其中一个;并且只有其中一个”;所以即使班级不是静态的;你还在创建它的静态实例。
答案 2 :(得分:0)
因为包含类和访问成员是静态的,所以它使用奇异的内存空间。您必须假设静态类的引用(在本例中为locals,fields或properties)也是静态的(即使它们是非静态类的实例化)。
这个课程首先是静态的原因是什么?如果您正在使用共享逻辑,为什么不通过引用传递Dictionary来静态方法?