关于引用的问题。 Tolower ReferenceEquals 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (我的问题是:s2是指向abc的, 而s=s.ToLower();后 s同样也指向的是abc)我想不通的是为什么输出的是false。而下面的那段代码ReferenceEquals(a, b)却是输出true。 Console.WriteLine(ReferenceEquals(s, s2)); //输出false (我的问题是:s2是指向abc的, 而s=s.ToLower();后 s同样也指向的是abc)我想不通的是为什么输出的是false。而下面的那段代码ReferenceEquals(a, b)却是输出true。 恳请各位指定迷津。谢谢。 本帖最后由 bdmh 于 2014-02-24 16:22:05 编辑 就像new2个对象,赋相同的值,内容虽然相同,但肯定不是同一个引用。最后一个是常量优化,编译期间发现相同的常量只会有一个,就是同一个引用了。 当把一个字符串常量放入堆栈时,.net做了优化,它会直接复用已经初始化的字符串。但是一旦你实际算出来的,例如通过 ToLower 计算出来的,那么就不存在这个优化了。 字符串的值是不能修改的。当你用s=s.ToUpper()后,“abc"依然保持不变,而是新开辟一块内存用来存放"ABC",并且让s指向"ABC".而原来的s2依然指向"abc"所在的内存。所以两个变量指向的是内存中不同的地址。所以返回false.最后的代码中为什么返回true?这是因为.net 的字符串池的机制,为了提高效率,.net采用这样一种机制。因为你第一次赋值变量为"abcd"时,这个字符串已经放到了内存池中,接着第二个变量又赋值为"abcd",这时会直接让第二个变量指向这个已经存在的字符串,而不是去重新创建一个新的字符串,采用这种方法就提高了效率。 问题是当我再次s=s.ToLower();的时候 此时的s="abc" 。 而之前内存中已经创建了一个"abc",用s2来指向它的。 按照.NET的优化机制,s=s.ToLower()的时候应该是让s再次指向s2所指向的"abc"才对啊。 没有这个优化机制。.net没有你想象的那样肯花很多时间去做貌似智能的东西。只有在初始化装载字符串常量的时候(这恰好对应MSIL预设的唯一条汇编代码)才能优化,而计算出来的不能优化。 问题是当我再次s=s.ToLower();的时候 此时的s="abc" 。 而之前内存中已经创建了一个"abc",用s2来指向它的。 按照.NET的优化机制,s=s.ToLower()的时候应该是让s再次指向s2所指向的"abc"才对啊。我没有把字符串池讲得很详细,你可以参考10楼的回复,另外去网上或书上看一下这个优化机制。 问题是当我再次s=s.ToLower();的时候 此时的s="abc" 。 而之前内存中已经创建了一个"abc",用s2来指向它的。 按照.NET的优化机制,s=s.ToLower()的时候应该是让s再次指向s2所指向的"abc"才对啊。我没有把字符串池讲得很详细,你可以参考10楼的回复,另外去网上或书上看一下这个优化机制。谢谢你的详细解答,辛苦了您了,非常感谢。 基本是 Copy-On-Write ( COW )(写时复制) 没有这个优化机制。.net没有你想象的那样肯花很多时间去做貌似智能的东西。只有在初始化装载字符串常量的时候(这恰好对应MSIL预设的唯一条汇编代码)才能优化,而计算出来的不能优化。谢谢。明白了。 删除xml节点 大家帮忙看下啊。。在等。。。。 c#父子窗体问题 DATAGRID的滚动条能不能让它一直存在 获取硬盘序列号问题,急急急!!! 强类型DATASET和自定义实体哪个更好些? Console.WriteLine 这句是怎么用呀,有没有全面的资料,关于c#函数,或语句用法? c# treeview 提问 datagrid问题 各位老菜,这个对话框在WebForm中如何实现? 匹配datetime查询的问题 SkinForm皮肤插件的使用关于 SkinRichTextBox的使用
当你用s=s.ToUpper()后,“abc"依然保持不变,而是新开辟一块内存用来存放"ABC",并且让s指向"ABC".而原来的s2依然指向"abc"所在的内存。所以两个变量指向的是内存中不同的地址。所以返回false.最后的代码中为什么返回true?
这是因为.net 的字符串池的机制,为了提高效率,.net采用这样一种机制。因为你第一次赋值变量为"abcd"时,这个字符串已经放到了内存池中,接着第二个变量又赋值为"abcd",这时会直接让第二个变量指向这个已经存在的字符串,而不是去重新创建一个新的字符串,采用这种方法就提高了效率。
问题是当我再次s=s.ToLower();的时候 此时的s="abc" 。 而之前内存中已经创建了一个"abc",用s2来指向它的。 按照.NET的优化机制,s=s.ToLower()的时候应该是让s再次指向s2所指向的"abc"才对啊。
没有这个优化机制。.net没有你想象的那样肯花很多时间去做貌似智能的东西。只有在初始化装载字符串常量的时候(这恰好对应MSIL预设的唯一条汇编代码)才能优化,而计算出来的不能优化。
问题是当我再次s=s.ToLower();的时候 此时的s="abc" 。 而之前内存中已经创建了一个"abc",用s2来指向它的。 按照.NET的优化机制,s=s.ToLower()的时候应该是让s再次指向s2所指向的"abc"才对啊。
我没有把字符串池讲得很详细,你可以参考10楼的回复,另外去网上或书上看一下这个优化机制。
问题是当我再次s=s.ToLower();的时候 此时的s="abc" 。 而之前内存中已经创建了一个"abc",用s2来指向它的。 按照.NET的优化机制,s=s.ToLower()的时候应该是让s再次指向s2所指向的"abc"才对啊。
我没有把字符串池讲得很详细,你可以参考10楼的回复,另外去网上或书上看一下这个优化机制。谢谢你的详细解答,辛苦了您了,非常感谢。
没有这个优化机制。.net没有你想象的那样肯花很多时间去做貌似智能的东西。只有在初始化装载字符串常量的时候(这恰好对应MSIL预设的唯一条汇编代码)才能优化,而计算出来的不能优化。谢谢。明白了。