现在学到了值类型和引用类型,有点糊涂了,现请教大家
static void Main(string [] args)
{
int i = 123;
object o = i;
i = 456;
}
如果按值类型和引用类型的概念来说的话,o不是指向了i的内存地址了么,那现在i的值改变了,i的内存地址还是不变的吧?但在控制台打印出来是 i = 456;o = 123;这是为什么?还有个问题,就是正则表达式可以再任意平台使用么?我只是在JavaScript上用过,请教一下
static void Main(string [] args)
{
int i = 123;
object o = i;
i = 456;
}
如果按值类型和引用类型的概念来说的话,o不是指向了i的内存地址了么,那现在i的值改变了,i的内存地址还是不变的吧?但在控制台打印出来是 i = 456;o = 123;这是为什么?还有个问题,就是正则表达式可以再任意平台使用么?我只是在JavaScript上用过,请教一下
解决方案 »
- 怎么给listview绑定数据
- 向数据库中插入 numeric 字段问题
- C#加密解密问题
- 如果光标已经在一个输入控件的起始位置,按ESC键,就视为无效,因为我有一控件如果光标已经在起始位置,再按ESC就会出错。
- 将Panel中的内容保存成一张图片的问题。。。
- girdview中可否根据内容的多少,自动调整行高?
- winform导出Excel报如下错是怎么回事?
- 新手问题
- winform中,如何当鼠标点击datagrid时,鼠标所在的那一行被选中;并且能够用up、down键来移动选中的行?
- 如何在C#的控制台程序中调用方法删除当前用户的Cookies
- C#中Byte前缀 0x4F是什么编码格式
- 大家好,我问个WebService初始化的
object o = i;
i = 456; i最终改变了它的内存地址, 故 i =456,
对象 o 它是在 i = 456; 之前引用i = 123的这个内存地址,它不管i 如何变化,它始终指向i = 123这个内存地址 。o 它是引用类型, i 为值类型我是这样理解的。
---------------------
i分配的内存地址与o分配的内存地址根本就是两个地方,装不装箱都不是一个概念...注意...严重输入错误...
相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个新对象。次之,取消装箱所需的强制转换也需要进行大量的计算。有关更多信息,请参见性能。--
注意到这句 “必须分配并构造一个新对象” 也是说 这不能象你解释的那样是引用指向这个值变量。
明天我再说,循便看看别人怎么说
值类型在内存的一个地方(堆栈)存储它们自己和他们内容。
引用类型在内存的一个地方(堆)存储一个引用,而在另一个地方存储内容。
值类型和引用类型的一个区别是,值类型总是包含一个值,而引用类型可以是NULL空,表示它们不包含值。但
是可以使用可空类型MSDN:
C#2008 :ms-help://MS.MSDNQTR.v90.chs/dv_csref/html/8da9bbf4-bce9-4b08-b2e5-f64c11c56514.htm
int i = 123;
object o = i; // Implicit boxing
i = 456; // Change the contents of i此示例使用装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。值类型的变量存储数据,而引用类型的变量(/对象)存储对实际数据的引用。基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
-------------------------------------------------------------
总之,在这里,object o 始终是指向 123的。参考:
http://terrylee.cnblogs.com/archive/2005/12/26/304876.aspxhttp://topic.csdn.net/u/20090328/10/1b3005e6-6662-4a84-aac5-6ab03b013273.html
按你给的地址
MSDN:
----------------------------------------------------------------------
C# 复制代码
int i = 123;
object o = (object)i; // boxing
然后,可以对对象 o 取消装箱并将其赋值给整型变量 i:C# 复制代码
o = 123;
i = (int)o; // unboxing
性能
相对于简单的赋值而言,装箱和取消装箱过程需要进行大量的计算。对值类型进行装箱时,必须分配并构造一个新对象。次之,取消装箱所需的强制转换也需要进行大量的计算。有关更多信息,请参见性能。
----------------------------------------------------------------------
后面的 都是你的描述和推论吧,
----------------------------------------------------------------------
此示例使用装箱将整数变量 i 转换为对象 o。这样,存储在变量 i 中的值就从 123 更改为 456。该示例表明原始值类型和装箱的对象使用不同的内存位置,因此能够存储不同的值。 值类型的变量存储数据,而引用类型的变量(/对象)存储对实际数据的引用。 基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。总之,在这里,object o 始终是指向 123的。
----------------------------------------------------------------------
在你的这段描述中,有些部分我觉得是对的,但是加色和最后的总之部分,我觉得不是有问题就是多余描述或推论。
object o=i;时 这个是box操作,不是引用之间的赋值操作,本来也就没有两引用类型嘛,
这里就是box操作 MSDN已经说得很清楚 了“对值类型进行装箱时,必须分配并构造一个新对象”;理解不了这个"新"字的含意吗?
32楼根本是错误解释,还有41楼回帖不看帖的典型...栈和托管堆根本是两块不同的内存区域中,何来“object o 始终是指向 123”、“o指向了 i的地址 123”?引用类型的值怎么可能在栈上?第3点很清楚...引用类型实例的引用存放在栈上,引用类型实例的值存放在托管堆上....这也是初学者容易混淆的地方...引用类型实例是分成两部分,分别存放在栈和托管堆上的,要注意引用类型实例的引用和值是两码事...
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
2、基本数据类型在超出作用域后就立即释放栈区内存,引用数据类型在超出作用域后该常量指针也会立即释放栈区内存,但是他所引用的对象所包含的数据不会立即释放,会在后面的某一个时刻由垃圾回收器检测到,然后收回。
3、在泛型里面只能使用引用类型,不能使用基本类型。
4、在==操作符上,基本类型当然是比较值是否相等,引用类型是比较这两个引用是否指向同一地址。
5、基本数据类型只能表示数据类型,而引用类型还能够表示复杂的数据类型
6、java虚拟机处理基本数据类型变量和引用类型变量的方式是不一样的:java虚拟机在处理基本数据类型变量时会为其分配数据类型实际占用的内存空间;而对于引用类型变量,它只是指向堆区的一个实例的指针。
7、引用类型的变量是对象具有可调用的方法,而基本数据类型则没有方法可以调用;
说的不是 基本数据类型与引用类型的区别吗 ?
有更详细的吗?