请问这种现象怎么解释,很不理解,有关static

愚者只看星不看答案 2012-03-20 05:32:30
在Asp.net中,如果在某个类(aspx.cs)中声明一个static string字段common,
A用户打开浏览器,将common设置为字符串a,
B用户打开浏览器,将common设置为字符串b,
此时,如果A页面不停的刷新,一会儿就可以看到common的值变为b
这里可以看出静态成员与实例成员的区别。


但是请看以下控制台的示例


class Program
{
static string msg = string.Empty;
static void Main(string[] args)
{
if (args.Length > 0)
{
while (true)
{
Console.WriteLine(msg);
Thread.Sleep(2000);
}
}
msg = Console.ReadLine();
Console.ReadLine();
}
}



如果编译后好,文件名叫console1.exe.
我现在运行该应用程序的两个实例。
第一次我直接双击console1.exe,在等待输入的地方输入a字符。然后msg=a
紧接着第二次(上个应用没有关闭),我复制console1.exe在硬盘上的完整路径。然后启动cmd命令,在编辑菜单中点粘贴,
即将完整的console1.exe的路径粘贴上来,后面加一个参数 -b,此时应该每隔二秒钟在控制台中显示a
但实际运行结果却依然显示是string.empty.
请问怎么解释这种实现。难道我对static的理解有错误?
...全文
170 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
EnForGrass 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nonocast 的回复:]

A用户打开浏览器,将common设置为字符串a,
B用户打开浏览器,将common设置为字符串b,
但你后台的网站是在一个Process上,所以static有效
而打开2个exe是两个Process,static互相独立
[/Quote]
我认同在C#,static是类的所有实例所共享,static变量在线程间共享,进程间不共享

threenewbee 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jshi123 的回复:]
确切说是AppDomain的隔离性
[/Quote]
这是确切的说法。因为CLR不同于原生程序,是可以在一个进程内托管多个不同的程序的。

当然从广义上看,CLR相当于一个操作系统,AppDomain相当于一个进程。对于几乎所有的程序(包括其他语言、平台),进程是独立的,进程间共享数据必须依赖操作系统提供的服务通讯,这也是现代多任务操作系统的进程隔离性。
冰镇宝贝321 2012-03-21
  • 打赏
  • 举报
回复
我来看看。。。
  • 打赏
  • 举报
回复
感谢大家的回复。
稍候结贴。

还有一个有点难度的,帮忙看看。

http://topic.csdn.net/u/20120321/18/03aff7ab-78ea-4797-ae80-4d77f7f10e7f.html?9305
jshi123 2012-03-21
  • 打赏
  • 举报
回复
确切说是AppDomain的隔离性
xboxeer 2012-03-20
  • 打赏
  • 举报
回复
两个在不同的应用程序域里面 互相不影响
porschev 2012-03-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 truelove12 的回复:]

我原来的也是猜,运行两个应用程序实例,这两个 实例运行在不同的进程中,而因为windows的进程是内存和资源与其它进程物理隔离。。。

看来猜测得到部分验证,不知道有没有其它意见的朋友。
[/Quote]

其实一点都不复杂吧

同一进程中对静态变量的操作会改变值。。。

而static变量在不同进程间是不共享的,他们占用的是不同的同存空间,所以互不影噢
  • 打赏
  • 举报
回复
我原来的也是猜,运行两个应用程序实例,这两个 实例运行在不同的进程中,而因为windows的进程是内存和资源与其它进程物理隔离。。。

看来猜测得到部分验证,不知道有没有其它意见的朋友。
happytonice 2012-03-20
  • 打赏
  • 举报
回复
两个应用程序类似在两个网站上,各自打开了一个页面。
和一个网站上打开了两个页面是不同的。
传递正能量 2012-03-20
  • 打赏
  • 举报
回复
两张网页用的是同一个服务器的同一个程序,一块内存

两个程序用的是两个不同的程序,两块内存


ktei2008 2012-03-20
  • 打赏
  • 举报
回复
通俗来讲,static是不跨exe的。虽然你开了两个console1.exe,但是它们之间是不共享任何变量的,即使那个变量是static.
nonocast 2012-03-20
  • 打赏
  • 举报
回复
A用户打开浏览器,将common设置为字符串a,
B用户打开浏览器,将common设置为字符串b,
但你后台的网站是在一个Process上,所以static有效
而打开2个exe是两个Process,static互相独立
nonocast 2012-03-20
  • 打赏
  • 举报
回复
static的有效区域在一个进程(Process)内。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧