zoukankan      html  css  js  c++  java
  • .Net字符串驻留池

    在.Net中,对于相同的字符串,.Net会将它们指向同一个地址,它们是相同的实例。.Net中的字符串并不会更新,当更改一个字符串变量时,由于字符串的不可变性,.Net实际上是新创建一个字符串,而将变量地址指向新创建的字符串地址。

      string s1 = "Hello";
        string s2 = "Hello";
        bool b = Object.ReferenceEquals(s1, s2);    
        Console.WriteLine(b);   //输入 True 它们是同一个实例

      CLR默默地维护了一个叫做驻留池(Intern Pool)的表。这个表记录了所有在代码中使用字面量声明的字符串实例的引用。这说明使用字面量声明的字符串会进入驻留池,而其他方式声明的字符串并不会进入,也就不会自动享受到CLR防止字符串冗余的机制的好处了。

        StringBuilder sb = new StringBuilder();
        sb.Append("He").Append("llo");
        string s1 = "Hello";
        string s2 = sb.ToString();
        bool b = Object.ReferenceEquals(s1, s2);
        Console.WriteLine(b);   //输出 False 它们不是相同的对象

      这里输出Fasle的原因是,虽然s1,s2是相同的字符串,但是由于s2不是通过字面量声明的,CLR在为ToString()返回值分配内存时,并不会到驻留池中去检查是否有值为"Hello"的字符串已经存在了,所以自然不会让s2指向驻留池内的对象。

  • 相关阅读:
    UML统一建模语言笔记
    从零开始学JavaWeb
    也谈微信小程序
    Memcached,你懂的
    一个简单的配置管理器(SettingManager)
    我的AngularJS 学习之旅
    .NET Core 跨平台
    ASP.NET Core 中间件自定义全局异常处理
    面试必考题——递归解题套路
    程序员着装指南
  • 原文地址:https://www.cnblogs.com/tiantianle/p/5585680.html
Copyright © 2011-2022 走看看