我学习过Java.不敢说精通,但是对基本类型(8种)和包裹类(基本类型相对应)还是清楚的.在学C#的时候,发现有个系统类型(System.Int32)和java里的包裹类(包装类, wrapper class)几乎一样.比如,在java里,基本类型int 对应着包裹类(包装类, wrapper class) Integer.可是我有疑问,首先看例子:java 中的转换int a=5;
Integer aw=new Integer(a);// 转换基本类型到包裹类
int b=Integer.intValue(aw);//转换包裹类到基本类型
String c=b.toString();// 转换基本类型到String 
int d=Integer.parseInt(c);//转换String 类型到基本类型int.C#中的转换int a=5;
Int32 aw=a;// int==Int32 , 包裹类和基本类型完全一样?
int b=(int)b;//好像没有区分?用强制转换就可以了?
String c=b.ToString(); // or Convert.ToString(b); 除了名字不一样外,基本和java一样
int d=Int32.parse(c); // or Convert.ToInt32(c); 除了名字不一样外,基本和java一样
以上是我已经列出来了,我想问, 在C#里,包裹类和基本类型没有区别,或者说C#里没有值类型,只有结构类型和引用类型两种?如果你是高手,请高手我,在内存里,C# 的System.Int32是储存在哪里的,结构如何?是在stack(堆栈) 里?执行了如下的语句:
int a=5;
Int32 aw=a;
int b=(int)b;
内存中的分配和指向是如何进行的?
谢谢...

解决方案 »

  1.   

    c#里的基本数据类型分为值类型和引用类型,结构也是值类型,而类是引用类型,预定义的引用类型包括string和object,但是string的一些操作与引用类型的常用操作是有区别的,这是运算符重载的结果。对于int类型,在c#中总是32位的带符号整数,声明一个int类型的变量时,实际上是.net结构System.Int32的一个实例,就是说在语法上,可以把所有的基本数据类型看作是支持这些方法的类,就象int a=1;string s=a.ToString(); 
    c#预定义类型并没有内置于语言中,而是内置于.net framework中,这些值类型仍然是存储在堆栈中的,结构也是,但是类是引用类型,存储在堆中。其它的基本数据类型也是一个道理,分别对应一个.NET(CTS)类型。
    内存中的分配和指向和java类似,对于值类型,在堆栈中是向下填充的,而对于引用类型,在堆中是向上填充的