http://bbs.csdn.net/topics/391055599
(一)
如果简写,那么可以写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
Store
{
private
static
DataTable dt;
public
static
object
dtFlag =
new
object
();
public
static
DataTable GetDt()
{
lock
(dtFlag)
{
if
(dt ==
null
)
dt = DAL.GetData();
return
dt;
}
}
}
|
如果要提高一点微不足道的“性能”,可以写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
class
Store
{
private
static
DataTable dt;
public
static
object
dtFlag =
new
object
();
public
static
DataTable GetDt()
{
if
(dt !=
null
)
return
dt;
lock
(dtFlag)
{
if
(dt ==
null
)
dt = DAL.GetData();
return
dt;
}
}
}
|
这就引出了回答上面的你在#2楼的这个问题。实际上,就算不lock,就算是你的asp.net应用恰好“同时”被两个消息处理线程执行到
1
|
if
(Store.dt!=
null
)
|
我并不是说应该或者不应该lock。而是这里的代码本身是可以容许有瑕疵的,有瑕疵也没什么大不了的。除非你确实将一个由于 Store.dt=DAL.GetData(); 语句被执行了不止一次而产生的bug摆在面前。
注意,我再次强调,我此刻不是在讨论是非问题。而是“用什么方法来保证质量”。我们用“bug的存在性”来评判质量,而不是用编程的洁癖规则来评判。
(二)
webform和winform的编程思路完全不同的
winform就是一个人在用,在自己的电脑内存里,不会有别的用户的数据
而webform是个网站,它天生是多线程,是服务端和客户端的通信程序
在webform里,static类型是所有线程公用的,那么就会出现所有用户的数据互相错乱的现象
所以除非是所有用户公用的数据(比如数据库连接字符串),否则不要放到static类型的变量里去