为什么说string是引用类型,但是又有值类型的特点呢?

这要从string类型的内存驻留机制说起,这也是CLR对其进行优化的一种方式

#region string类型特殊的内存驻留机制
            //string类型的特殊之处就在于CLR之中做的相关的优化
            //当有多个字符串变量包含了同样的字符串实际值时,
            //CLR可能不会为它们重复地分配内存,而是让它们统统指向同一个字符串对象实例。
            string strA = "Hello";
            string strB = "Hello";

            Console.WriteLine(Object.Equals((Object)strA, (Object)strB));
            Console.WriteLine(Object.ReferenceEquals((Object)strA, (Object)strB));
            Console.WriteLine(strA.GetHashCode());
            Console.WriteLine(strB.GetHashCode());


            string str1 = "Hello";
            string str2 = "Hello";
            Console.WriteLine(Object.ReferenceEquals(str1, str2));

            //关于驻留池 字面声明的变量没有检查驻留池
            StringBuilder sbr = new StringBuilder();
            sbr.Append("He").Append("llo");

            string str3 = "Hello";
            string str4 = sbr.ToString();

            Console.WriteLine(Object.ReferenceEquals(str3, str4)); //返回false,虽然两个字符串的值相同,但是在内存中式不相同的两个引用

            Console.WriteLine(Object.ReferenceEquals(str3, str1));

            //强制CLR检查驻留池
            StringBuilder sbr2 = new StringBuilder();
            sbr2.Append("He").Append("llo");
            string str5 = "Hello";
            //在转换之后进行检查,时候有相同的字符串在内存中,如果存在,就返回一个指向它的引用
            string str6 = String.Intern(sbr2.ToString());
            Console.WriteLine(Object.ReferenceEquals(str5, str6));

            #endregion

转载于:https://www.cnblogs.com/Sky-cloudless/archive/2012/05/16/2503368.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值