解决方案 »

  1.   

    先指出你的语法错误 类里的字段都是私有的 你不能够p1.age 取不到的内存是不一定连续
      

  2.   

    你提出这样的问题,让人联想到一句俗语,瞎子摸象
    p1.name是string类型,string是特殊的引用类型,.net 下string使用池技术来实现字符串的 ,p1.name是个引用而已指向了字符串池中一个字符串。
    另外.net是先要编译喂il代码,运行时再编译为机器代码运行的,机器代码不存在什么class ,类型之类的概念,il如何编译,微软并不公开,所以他的内存地址是否连续,对象如何映射到机器码,我无法回答你!
      

  3.   

    Person  p1,p2;
    p1.age=10;
    p1.name="abcd";p1,p2只是个引用而已
    如果没有p1 = new Person();
    p1.age=10;
    p1.name="abcd";这两句会报错的你应该不会这门语言吧,先从基础的看起吧~~
      

  4.   

    不会在一起,
    p1.age=10在GC HEAP中,

    p1.name="abcd"存在于system domain 中的global string literal table
    你可以用VS或者windbg把那个instance的内存打印出来验证嘛
      

  5.   

    你可以认为它是连续的。
    你也可以认为它是不连续的。有什么关系呢?高级语言的特点就在于,不管编译器因为不同的目标平台(例如x86和ARM)、不同操作系统(例如windows xp、windows 8和linux)差别有什么不同版本,不管底层发生什么样的巨变,高层次的运行结果都一致性不变。
      

  6.   

    我们研究“原理”通常是基于.net frameowrk的,是假设我们终将需要自己开发这些组件、控件、框架。因为这里的深度开发,将来会有决定性价值。如果你所纠结的“原理”仅仅是最低级的,那么貌似你好像总是研究原理似地,其实你空耗时间根本没有用来研究你应该来研究的原理!
      

  7.   

    因此纠结于c语言入门时的那些底层概念,是没有必要的。只要你有c或者汇编语言的入门编译知识就行了,而对于c#程序的“最底层”则不必要去搞清楚。我们可以使用堆、栈、地址等的概念来偶尔地帮助理解一些概念,但是一般人都不要去计较他。中国有个陈景润,他研究“1+1”猜想问题,据说走在马路上都撞在电线杆子上了。而实际上在各种工程上,都是用计算机来“无限次”地验证各种计算结果,而不是靠养一帮“陈浸润式的学者”来搞工程的。我们学习c#,就是要成为一个优秀的工程师,创造1000万倍的可见价值。而通常不需要自虐地“撞电线杆子”。
      

  8.   

    这么说吧,age的地址与name的地址应该是连续的,但"abcd"与age不是连续的,C++是这样的,可以验证,C#不能取name的地址,所以age与name是否连续不能确定,但你说的是系统分配string大小的空间存储p1.name的这部分内存,它一定与age不连续,一个在栈上,一个在堆上,你把name改成int型变量,试试就知道了(如下代码如果name是string类型的话,&p1.name是非法的,所以不能验证)class Person
            {
                public int age;
                public int name;
            }        static unsafe void Main(string[] args)
            {
                Person p1=new Person();
                p1.age = 10;
                p1.name = 11;
                fixed (int* page = &p1.age)
                fixed (int* pname =&p1.name)
                {
                    Console.WriteLine((int)page);
                    Console.WriteLine((int)pname);
                }
                Console.ReadKey();
            }
      

  9.   

    高级语言的特点就在于,不管编译器因为不同的目标平台(例如x86和ARM)、不同操作系统(例如windows xp、windows 8和linux)差别有什么不同版本,不管底层发生什么样的巨变,高层次的运行结果都一致性不变。这话感觉很有道理。
      

  10.   

                Person p = new Person();
    00000033  mov         ecx,562774h 
    00000038  call        FFF0FBF0 
    0000003d  mov         dword ptr [ebp-48h],eax 
    00000040  mov         ecx,dword ptr [ebp-48h] 
    00000043  call        FFF2A350 
    00000048  mov         eax,dword ptr [ebp-48h] 
    0000004b  mov         dword ptr [ebp-44h],eax 
                p.age = 1;
    0000004e  mov         eax,dword ptr [ebp-44h] 
    00000051  mov         dword ptr [eax+8],1 
                p.name = "la";
    00000058  mov         eax,dword ptr ds:[030521CCh] 
    0000005e  mov         edx,dword ptr [ebp-44h] 
    00000061  lea         edx,[edx+4] 
    00000064  call        6F66F6D0 
    我看不懂,我们学校没学过这个,不知道有没有用,哪位大神指点一下