1. 是数值。
2. 不知道什么意思。任何变量都可以这样使用可实例化的类型来声明啊?!例如可以写 SqlConnection a; 来定义变量a。
3. 没有看到上下文,谁知道你断章取义的是什么时候的话呢?!一条  int a=10; 语句就会在运行时创建这个值,并且如果必要的话(如果寄存器不够用的话)会被放入栈中。如果说计算 string.Format("a={0}",a) 这种结果,才是先装箱然后去调用Format方法的。但是这种装箱操作是你需要付出的代价,不付出代价怎么会有收获(Format的结果)?
4. “类的对象应该在堆上”这是什么意思?不懂。引用对象其实际的内容在堆上分配(而且是随时浮动的,而不是固定地址的),但是其引用肯定是在栈上啊?!这里的引用,跟c语言的所谓地址完全是两回事。.net的引用最极低地也是“地址的地址”,是地址的非常间接的引用,分配在堆上的对象的物理地址随便浮动,而引用不变。在描述中,会有各种“简称”。例如a明明只是变量,有时候我们说“对象a”省去了说“变量a所代表的对象”。有时候我们说“对象a的地址是浮动的”是省去了说“分配在堆上的变量a所代表的具有引用类型的那个对象的内容部分的地址是浮动的。

解决方案 »

  1.   

    没有通过 object 传递的时候, 是不必要装箱拆箱的.
    自动进行装箱拆箱时,也是成对使用的,不必要过多考虑.
      

  2.   

    ①int a=new int(); 这种写法,a中存储的是地址吗?
    当然不是,int * a = &(new int());才是
    ②有人说,int是个静态类,所以可以 int a;这个说法对吗?
    不是,int是简单类型,ValueType
    ③ 版主说,int 是值类型,在编译的时候会自动进行装箱拆箱,请问int a=10在编译时会被装箱成对象吗(如果这样岂不是更复杂了)?

    ④ 一方面:int是值类型,int a 定义在栈上;另一方面int又继承自Object类,是个类,类的对象应该在堆上。这不是矛盾嘛?
    值类型并不一定在堆栈上
      

  3.   

    int a = 10不会装箱,但是a.ToString()会。
      

  4.   

    上次想回答你这个问题,但贴被锁了,只要你把思想有逻辑划分这个思维就可以解决你的困惑了C#把所有类型都定义为继承Object的,这个是逻辑划分但是在编译器和在运行时int 虽然是继承Object的,(思想上的逻辑划分)
    但(内存上的)逻辑划分它有是值类型,所以它的内存分配在栈上,而不是堆上计算机在运行的时候,其实内存也是一片连续的地址,物理上也没有堆栈之分的
    出于分配内存和回收内存的方便,所以就把内存分为堆和栈(逻辑划分)一开始也没有面向对象语言的,后来有了面向对象语言,
    C++可以多继承,C#不可以,并且规定所有都是继承Object
    但计算机分配内存的逻辑才不会因为你多诞生几种语言而改变
    也就是语言只会遵守计算机分配内存的逻辑,而不是计算机遵守语言定下来的概念所以说int 继承了Object,只是C#的规定
    而计算机在运行的时候把int分配在栈上,会有冲突么?
    object o = 1;这样才会把1分配在堆上有人说,int是个静态类,所以可以 int a;
    肯定不是因为静态类的原因,而是语法的原因,
    简单来说就是为了偷懒 ,少写代码, 所以这样规定的,是不是很惊讶,
    没有什么高大上的东西,就是人类为了偷懒。哇咔咔我为什么知道上面的内容,推荐几本书,你可以看看
    《汇编语言(王爽第二版)》 这本书会告诉你 物理内存为什么会被逻辑划分为堆和栈
    《CLR via C#》 这本书会告诉 C#值类型和引用类型怎么分配在堆和栈上,和怎么转换《c++ programming》C++的设计者写的书,会告诉你他怎么设计C++的,很难懂,
    只是想告诉你
    int a 真的只是人类为了偷懒,
      

  5.   

    这绕着的人头晕。不过还好,不怎么int a怎么折腾,并不重要。
      

  6.   

    并不是int a就是在栈上,而是当它作为局部变量或者方法参数的时候才在栈上
      

  7.   

    当定义在外部(例如 static int a =10;)之后,如果在过程中使用到了a,那么会首先把a的值复制到(压入)栈,然后再使用栈上复制的值。而其实并不是直接使用 a。就这一点而言,程序实际运行时使用 a 的时候,其实不是使用a,而是使用栈上的a的复制品。
      

  8.   


    1. 是数值。
    2. 不知道什么意思。任何变量都可以这样使用可实例化的类型来声明啊?!例如可以写 SqlConnection a; 来定义变量a。
    3. 没有看到上下文,谁知道你断章取义的是什么时候的话呢?!一条  int a=10; 语句就会在运行时创建这个值,并且如果必要的话(如果寄存器不够用的话)会被放入栈中。如果说计算 string.Format("a={0}",a) 这种结果,才是先装箱然后去调用Format方法的。但是这种装箱操作是你需要付出的代价,不付出代价怎么会有收获(Format的结果)?
    4. “类的对象应该在堆上”这是什么意思?不懂。引用对象其实际的内容在堆上分配(而且是随时浮动的,而不是固定地址的),但是其引用肯定是在栈上啊?!这里的引用,跟c语言的所谓地址完全是两回事。.net的引用最极低地也是“地址的地址”,是地址的非常间接的引用,分配在堆上的对象的物理地址随便浮动,而引用不变。在描述中,会有各种“简称”。例如a明明只是变量,有时候我们说“对象a”省去了说“变量a所代表的对象”。有时候我们说“对象a的地址是浮动的”是省去了说“分配在堆上的变量a所代表的具有引用类型的那个对象的内容部分的地址是浮动的。------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    C#中任何类型的超类都是Object,int类型等值类型本质其实是struct 类,而struct类是一个sealed类,而struct类继承自ValueType类,无法被继承.之所以可以写int i = 1;这样的语法,这只是微软编译器给我们一种简便的申明赋值语法,反编译之后我们就可以看到其中的真相.微软的语法糖有很多.struct类是值类型,值类型与引用类型的区别就在于存储的栈和堆上,装箱和拆箱也只是将值类型的对象在堆和栈上挪动而已.