日期:2014-05-17  浏览次数:20897 次

2个问题,一个静态变量,一个session
做的是web应用,现在的代码结果如下:

public partial class list : System.Web.UI.Page
{

 
public static string UID="0";
  //public static string UID = Session["userId"].ToString();//我想声明成这个形式,可是报错:非静  
  //态字段要求应用对象

protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
UID=Session["userId"].ToString();

}

}
}

我声明的这个全局静态的UID,如果有多个人同时使用时,会不会出现问题。uid保存的用户的id。为何有此一问,因为有人说:静态变量尽量少定义 因为静态变量任何用户取到的都是相同的值。。

搞不清这中间的疑问,哪位详细解释下咯,谢谢。

------解决方案--------------------
static 声明一个变量,指向HttpContext.Session那可不行,那个Session不是静态的。

如果多个人用的话,只用一个静态变量肯定不行,如果你想这么简单的解决问题的话,那就弄一个static Dictionary<>
每个Session都会在一次会话中存在,不需要存,随用随取。
------解决方案--------------------
Session通过请求才会有的嘛,并不是初始化的时候就可以出来的。
------解决方案--------------------
我感觉这样做会乱掉
------解决方案--------------------
你可以在任何请求的时候给静态变量赋值,但是你定义静态变量的时候,还不存在Session,因此赋值失败。
------解决方案--------------------
还记得IE6、IE7浏览器吗?
每次打开一个IE,标题栏中都会有一个 -Internet Explorer
记得不?

无论你打开多少IE的 实例,这部分总是公用的。这里其实Internet Explore就可以定义为静态成员。因为对所有IE实例来说都是一样的

假设IE提供了一个界面,可以由我们用户来修改这部分文字。你将它修改为 微软浏览器
那么每个IE的实例的后面部分都变成了“微软浏览器”

但是"微软浏览器"前面的部分文字,却因为你打开的网址的标题不同而不同。

这里你应该能看出哪些是属于实例级的,哪里是属于类级别的了吧。

征对你的问题,显然不能用静态成员来保存登录用户的ID。
因为这样每登录一个,所有当前用户访问的实例中的静态ID都变了。最后你会发现,世界全乱套了。
------解决方案--------------------
静态变量就是全程序的一个公共库,谁对会对他造成影响
Session是每个浏览器一份,大家自己用自己的
------解决方案--------------------
C# code

    public static string UID = HttpContext.Current.Session["userId"].ToString();

------解决方案--------------------
哥们 这样做肯定会出问题的,假如A用户打开这个页面 然后B用户打开这个页面 之后A用户的操作都是使用的B用户的帐号了