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

  • 问题

  • 在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的理解有错误?

    • 已移动 Neddy Ren 2012年3月20日 7:11 (发件人:Visual C#)
    2012年3月20日 0:36

全部回复

  • 难道是两个实例运行在不同的进程中,而又因为进程的内存和资源是物理隔离的??
    2012年3月20日 0:38
  • 字符串驻留是基于进程范围内的,所以控制台的示例测试结果是OK的。

    2012年3月20日 7:46
  • 感谢您的回复。

    我的测试是,两个实用程序的实例的进程ID是不一样的。

    在windows中进程是物理隔离的,所以数据无法共享。这种机制也就是常说的一个进程

    无法破坏另一个进程的数据。

    我想这个和是不是字符串没有什么关系。

    2012年3月20日 12:40
  • 这个是肯定的,2个进程的数据肯定是隔离的,

    不过,你第一个例子是在同一个应用程序域呢,而第二个例子是在2个完全不同的进程呢,拿它们之间的测试结果来对比有什么意义呢?

    2012年3月20日 15:18
  • 这个是肯定的,2个进程的数据肯定是隔离的,

    不过,你第一个例子是在同一个应用程序域呢,而第二个例子是在2个完全不同的进程呢,拿它们之间的测试结果来对比有什么意义呢?

    感谢您的回复。

    并不是想做比较,我当时并没有想到控制台应用的两个实例会运行在不同的进程中,所以有此一问。呵。我还有一古怪问题,有兴趣看看吗?

    http://social.microsoft.com/Forums/zh-CN/295/thread/d50d3d8e-858e-4c40-8264-830cd91caa60

    2012年3月20日 15:52