`
阅读更多
原帖地址:http://www.cnblogs.com/dyhouse/archive/2013/05/29/3107243.html

  C#中string关键字相信大家都不陌生,很熟悉。今天主要讲的内容呢,就是围绕着这个简单的关键字。

  string在C#中是用来定义字符串变量的关键字,很普通,普通得大家可以忽视她,如果你忽视了她,那么你已经失去了一段美好的回忆。下面我们就来追溯这段回忆吧。

首先介绍两个概念:1、字符串池,2、字符串驻留池

1、 字符串池是编译器为执行过程中程序映像和内存中的相同字符串创建单个副本,从而得到较小的程序。

2、 字符串驻留池是CLR初始化时创建一个内部哈希表,表的key是字符串,value是托管堆中String的引用,该表就是驻留池。因为字符串是不变量,如果内存中存在多个相同字符串的实例,便会造成内存的浪费,故高级语言(C#、Java)等都用了字符串驻留池来提高内存利用率。

在这里首先介绍这两个概念的用意是为了告诉大家字符串池和字符串驻留池是不同的概念,不可混淆。

字符串在.Net世界里是如何存储的呢?

我们先看如下流程图:

1、

说明:我们以上操作创建了一个”Aaron”不变量字符串,然后经C#编译器字符串池机制优化了程序集(这里也可以设置编译器禁用字符串池机制,我们针对一般情况,特殊情况忽略),当程序集加载到应用程序域时,CLR2.0版本以上默认会驻留程序集中不变量字符串。

2、

说明:eng_Name并没有创建新的字符串,eng_Name和name引用了托管堆中同一个不变量字符串。

3、

说明:name,eng_Name,full_Name引用了0x~位置的字符串实例,而my_Name则引用了0x$位置的字符串实例。因为full_Name由两个不变量字符串串联起来的,编译器直接认为是”AaronPan”,而my_Name由两个变量串联起来,我们查看IL可以发现两个变量通过Contact()创建了一个新的字符串。

4、

说明:这里采用String类Intern方法访问字符串驻留池。因为驻留池中已经存在一个完全相同的字符串,所以返回匹配字符串的引用,而0x$位置的实例则等待GC回收。

注:

1、 字符串驻留池引用的字符串不会被垃圾回收器回收,其生命周期会伴随着应用程序进程终止而终止。

2、 字符串驻留池虽然可以提高内存利用率,但他要额外维护一个内部哈希表,性能必定会下降,我们可以在C#编译器设置不开启字符串驻留功能。根据实际场景,合理应用。

 

——Aaron.Pan

 

本文链接

分享到:
评论

相关推荐

    String中三种加法的区别

    JAVA的确是一种令程序员陷入两难境地的言语, 确切的说是思想. 它提供了如此丰富的library,让程序员能够很容易的写出功能强大的程序. 同时它也封装了如此多的细节, 让...但这往往是比较片面的,知其然而不知其所以然.

    string 帮助手册(spring2.5)

    《Spring 2.5 帮助手册》是Spring框架2.5版本的官方文档,旨在为开发者提供全面且深入的指导。Spring框架是Java开发领域中的一个核心框架,尤其在企业级应用开发中占据重要地位。它通过依赖注入(Dependency ...

    熟悉的陌生人系列之Stream知多少

    在这个"熟悉的陌生人系列之Stream知多少"中,我们将深入探讨Stream API的基本概念、工作原理以及与响应式编程的关联。 首先,我们来看一个简单的例子,计算列表中包含字符"a"的字符串的最大长度。在Java 8之前,...

    JAVA初学者在学习的过程中总是会遇到一些很疑惑的问题

    下面针对这些基础的问题进行一个详细的解答,以便后来者少走弯路,知其然知其所以然。 问题一:String 声明和引用 JAVA 语言中,String 是一个特殊的类,它的声明方式与其他类不同。例如,`String s = "Hello ...

    JavaScript必知必会(三) String .的方法来自何方

    String 我们知道javascript 包括:number,string,boolean,null,undefined 基本类型和Object 类型。 在我的认知中,方法属性应该是对象才可以具有的。 var str="hello,world"; var s=str.subString(,);//ell ...

    云知声集成AndroidStudio版(语音输入方案

    云知声是一家专注于智能语音技术的公司,其提供的集成Android Studio版语音输入方案,为开发者提供了便捷的API和工具,以便将语音识别功能轻松地整合到Android应用中。 首先,我们要理解云知声的语音识别技术是如何...

    Javascript String.replace的妙用

    字符替换是一个非常重要的功能,javascript 中有一个 String.replace( ),但是此方法有很多不为新手所知的妙用,如果用的好了,可以为您节省很多宝贵时间,还等什么?马上进来看看吧!

    JVM必知必会

    通过具体案例,如系统频繁FullGC、String.intern的使用等,可以更加深入理解JVM的运行机制和性能调优方法。 #### 结语 以上是对《JVM必知必会》中涉及的核心知识点的详细梳理。这些内容可以作为学习Java虚拟机的...

    太阳能光伏相关术语知多少.pdf

    7. PV组列(PV String) PV组列是将多个模板串联在一起,以提升系统的电压。例如,10片模板电压20伏特5安培串联成组列后,组列的电压将为200伏特,电流为5安培。 8. PV数组(PV Array) PV数组是将多个组列并联,目的...

    Android底层结构-SDKService线程知多少[归纳].pdf

    而“public void update(String s)”是一个接口方法,当需要更新UI时,会调用此方法并传入需要显示的字符串。 整体而言,文档片段所反映的是Android中服务的创建、绑定和后台任务执行的知识点,以及这些任务与主线...

    Javascript中String的常用方法实例分析

    字符串(String)是JavaScript中的基本数据类型之一,用于表示文本数据。在JavaScript中,字符串是不可变的,这意味着一旦字符串被创建,它的值就不能被改变。然而,JavaScript提供了一系列字符串对象的方法来对字符...

    C++ 实验报告 绝知此事要躬行

    在本篇C++实验报告中,我们将会深入探讨C++这一强大的编程语言,尤其是面向对象...总之,这份“绝知此事要躬行”的C++实验报告,是你踏入编程世界的宝贵资源,通过亲自动手实践,你将逐渐成长为一名熟练的C++程序员。

    C++必知必会_c++类型转换_C++字符pdf_Vc_

    本篇内容将详细解析C++中的类型转换机制,并结合《C++必知必会》这本书中的知识点进行深入探讨。 首先,我们来看C++的隐式类型转换。隐式转换是指编译器自动进行的类型转换,如从较小的数据类型(如int)转换到较大...

    Java初学者都必须知道的六大问题.doc|Java初学者都必须知道的六大问题.doc

    【Java初学者必知六大问题】 1. 引用与对象的区别 在Java中,`String s = "Hello world!"` 这样的声明实际上创建了一个指向String对象的引用变量s,而非直接创建了一个String对象。这里,s只是指向内存中包含"Hello...

    C# WINFORM 控件双向绑定少为人知的秘密

    C# WINFORM 控件双向绑定少为人知的秘密 在 WinForm 开发中,控件双向绑定是一个常见的问题。双向绑定指的是控件的值与数据源的值保持同步,当控件的值发生变化时,数据源的值也会相应地变化,反之亦然。今天,我们...

    场景文字检测(matlab) TSDFNS(text string detection from natural sc

    就我所知,十分完善的场景文字检测的代码网上是没有的,有的只是一些算法,或者比较过时的系统,本文的出现正是希望通过本人的一点努力填补这个空白,方便广大研究者能够更快入门,至少一开始研究就有一个基本框架。...

    Java初学者都必须理解的六大问题

    【Java初学者必知六大问题详解】 1. 引用与对象的关系 在Java中,当我们声明一个变量如`String s = "Hello world!"`时,实际上声明的是一个指向String对象的引用,而不是对象本身。这意味着`s`只是一个变量,它存储...

Global site tag (gtag.js) - Google Analytics