Meyer

断水
随笔 - 54, 文章 - 5, 评论 - 393, 引用 - 8
数据加载中……

禁止在页面中使用static变量

        今天,项目出现了问题,从表现看像是串Session,我们的Session变量使用的并不多。而且这个现象能够必然的重现。因为是别的组的程序我也没怎么去查。后来他来问我,Session没有问题,是static变量出了问题。static变量!!!我一下就敏感起来。然后去看他的代码。My God!一堆的static变量。其实都应该用ViewState来保存的。

        我以前给项目组的人解释 ViewState、Session、Application、static Member的时候说“不要在页面使用static变量,除非你自己确实清楚你在干什么。static变量和Application类似,而不是和Session一样。”。我现在的要求是“禁止在页面中使用static变量”。说得很绝对。


强调“禁止在页面中使用static变量”,出于以下原因。
一、 我怕还有人自以为很清楚,结果滥用static变量。而这种理解错误的后果很大。
二、 这是学习asp.net的人,很多人都会犯的错误(在csdn上老看到与此相关的问题)。
三、 C#语言的书,在讲授static Member的时候,都使用Console或则winform程序。给学习者在asp.net中的使用造成了误解。
四、 禁止使用static变量,合适的地方就会使用Application对象。而这个东东一般是在asp.net或者asp的书中提到,对他理解错误的人不多。
五、 asp.net的实际应用中static变量的作用极少,而对于极少几个可能会使用的地方,一般提供单件类更合适。

BTW:
     我对ViewState的使用不怎么规定,但我自己一般会提供property来包装ViewState的使用。
     使用Session我决定提供一个SessionHelper类来包装所有使用到的Session,禁止在页面中直接使用Session["dfdf"]这种方式。因为多人的工程会导致Session命名的冲突,这样要求一来容易查到冲突的命名,二来对冲突也容易修改。关键是Session也不是什么好东西,要有节制的使用。这样利于管理整个项目中使用的Session。贯彻这个要求也很容易,对项目中的文件搜一下'Session',就能很容易的找出违反规定的代码:D。
    对于Application我也是提供包装,跟Session的使用要求相似。

posted on 2004-04-23 19:35 Meyer 阅读(6468) 评论(30)  编辑 收藏 网摘 所属分类: .net 技术

评论

#1楼   回复  引用    

我也犯过这个错误: http://www.cnblogs.com/dudu/archive/2004/02/03/741.aspx
2004-04-23 20:32 | dudu

#2楼   回复  引用    

hehe,请教一个和static相关的问题
我在Glogal.ascx单元中,设置一个全局的SqlConnection用来
在整个ASP.NET项目中共享,这个方法是否可取?

public class Global : System.Web.HttpApplication
{
......
private static SqlConnection m_Connection;

public static SqlConnection PublicConnection
{
get
{
if (m_Connection == null)
{
//创建连接
}

if (m_Connection.State.ToString() == "Closed")
m_Connection.Open();

return(m_Connection);
}
}
}

现在在微软的ADO的资料中,似乎更加推荐断开的连接模式,就是在需要操作数据库的时候才去连接数据库???
2004-04-23 20:50 | aspring

#3楼   回复  引用    

这个错误和ASP.NET没有任何关系,这是OOP里面的知识,在类中如果定义了static的变量,他在所有类中是共用的,static变量的使用是不用实例化类的,所以也很好理解static变量和static方法在类实例中的公共性。static变量在使用程序递归和类的嵌套调用时做共享标志传递参数很有用处。怪罪ASP.NET真是冤枉啊...
2004-04-23 22:30 | birdshome

#4楼   回复  引用    

Good~把Session,Application和ViewState等变量通过一个公有的类来包装是一个很好的方法~
使用得当,可以避免很多麻烦的事~
2004-04-23 23:49 | hBifTs

#5楼   回复  引用    

其实我觉得出错的程序员对于Asp.NET的编程模式不够了解..
可能是把一般的WinForm程序混在一起了~
Asp.NET是用户请求一次,就产生一个新的线程去响应这个请示..与前一次操作是无关的,,即无状态的..所以才产生了Session等东东来保存状态~
2004-04-23 23:52 | hBifTs

#6楼   回复  引用    

知道了这些东西固然不会出错,但是据我实际中的经验,在这个问题上犯错的人不是一个两个。我在公司不是强调过一次两次,结果还是有人出问题(不过这个是新人)。
2004-04-24 00:08 | Meyer

#7楼   回复  引用    

@aspring

对于Connection应该是在需要的时候open不要的时候尽快释放。如果你的
系统只有一个connection,那么不说其他的问题。光是sql不能并行执行就会成为系统的瓶颈。而且这样完全不能利用数据库联结池的好处。
2004-04-24 00:11 | Meyer

#8楼   回复  引用    

static一般情况下放在一个单独的类中,用来保存应用程序配置信息
在我的工程中大量使用static readonly 和const变量,不过我是在另外单独系统工程中创建的类,在asp.net中,static变量相对其他几种保存信息的方法效率最高,也是最方便的。
2004-04-24 01:44 | coollzh

#9楼   回复  引用    

sessionHelper是什么东东,能否介绍一下,谢谢
2004-04-24 09:15 | jiangyu

#10楼   回复  引用    

@jiangyu
SessionHelper就是一个自己写的一个类,主要是用来屏蔽用户直接使用Session操作的..
示例如下:
class SessionHeler{
public void Add(string key,object value){
Session[key] = value;
}

public object GetInfo(string key){
return Session[key];
}

public Remove(string key){
Session.Remove(key);
}
}

使用时如下:
SessionHelper helper = new SessionHelper();
helper.Add(key,value);
helper.GetInfo(key);
2004-04-24 09:35 | hBifTs

#11楼   回复  引用    

static方法会有你说的问题吗?谢
2004-04-24 09:53 | Goodspeed

#12楼   回复  引用    

@Goodspeed

static方法没有任何问题
2004-04-24 13:09 | Meyer

#13楼   回复  引用    

@hBifTs :THANK U:)
我是弄了一个cachemanage类来管理,所有的session用到的变量,都要在这里生明:)。(就是为了不命名冲突)。
2004-04-24 13:55 | jiangyu

#14楼   回复  引用    

@hBifTs :看过sessionhelper后,有一个想法,就是在编译期依然无法知道命名冲突的问题啊:)
2004-04-24 13:57 | jiangyu

#15楼   回复  引用    

@jangyu
我所用的这个class其实,很简单。就是集中将使用到的Session放到一个类中,通过这个class的static property来访问。我得项目中的Session用的很少。而且都有明确的意义。比如:UserID,ProjectID之类。hBifTs和我说的还是不一样的。
2004-04-24 14:16 | Meyer

#16楼   回复  引用    

@Goodspeed

static方法与non-static方法的区别在于static方法没有this指针。他们都只是一段程序代码,没有这些问题。
2004-04-24 14:21 | Meyer

#17楼   回复  引用    

@Meyer :thank u.那我的做法与你的差不多:)。都是将session集中处理了,不过这样对于程序扩展就要改源文件有些缺点。
2004-04-24 15:42 | jiangyu

#18楼   回复  引用    

@Meyer :thank u.那我的做法与你的差不多:)。都是将session集中处理了,不过这样对于程序扩展就要改源文件有些缺点。
2004-04-24 15:42 | jiangyu

#19楼   回复  引用    

那如果把对数据库的访问都封装成一个static的函数类。会不会有什么影响?(注意:是静态类。不是静态变量。只想省点事。省去NEW 。当全局函数用。)
比如
我有个公共类。
里面有
class ComFun
public static DataSet GetDataSet(string .....)
{
...
return dataset;
}
public static IDataReader GetDataReader(string .....)
{
...
return IDataReader ;
}
使用时 DataSet ds=ComFun.GetDataSet("select * from orders");
IDataReader rs=ComFun.GetDataReader("select * from orders");
rs.close();rs.dispose();
用了好像没有什么问题。不过以后并发的人多了会不会有不良反应?
2004-04-26 13:32 | 使名扬

#20楼   回复  引用    

@使名扬
你这样做其实就是建立了一个工具类。这种处理方式是完全可行的。而且MS的Data Access Application Block就是这样处理的。建议你使用这个应用程序块或者在他的基础上裁减。当前的版本是v2。可以在http://www.microsoft.com/downloads/details.aspx?FamilyID=76fe2b16-3271-42c2-b138-2891102590ad&displaylang=en 下载。
2004-04-26 20:37 | Meyer

#21楼   回复  引用    

知识没能传承给新人,这个问题在很多公司都有。

我在公司里面搞个BBS,希望新人都能不要再走弯路
2004-04-27 16:15 | steeven

#22楼   回复  引用    

好提醒呀,我用了好多静态变量。
损失好大,不过终于明白了
2004-07-28 21:45 | dobly[未注册用户]

#23楼   回复  引用    

你的类,可以直接使用Session吗?

Session[key] = .... //需要引用什么命名空间?
2004-09-17 15:03 | kevin_Y

#24楼   回复  引用    

System.Web.HttpContext.Current.Session[key]
2004-09-17 21:28 | Meyer

#25楼   回复  引用    

如果想做到一个全局的SqlConnection,如何实现??
2005-05-18 14:28 | benben

#26楼   回复  引用    

为什么我在一个类中采用了static类型,在别的类中访问不到呢
2005-05-25 11:47 | chj916

#27楼   回复  引用  查看    

请教一下呵benben类似的问题:全局的自定义对象如何实现?使用Application存储自定义对象太麻烦了,每次都要进行转换。。。
2006-01-16 14:45 | 邓石      

#28楼   回复  引用    

我也曾经犯过这种错误,还好发现得早:-D
2006-06-15 09:53 | tloner[未注册用户]

#29楼   回复  引用  查看    

我们以前也曾发生过这个错误

后来改用ViewState了
2009-02-03 11:11 | 温迪妮      

#30楼   回复  引用  查看    

ViewState 可以保存大量的数据吗?
楼主说在页面中用static会有什么问题呢?问题没说呀。
2009-05-12 20:34 | lhking      



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 7409




相关文章:

相关链接: