首先,我们要知道的是String类型是一个引用类型,它的基类是Object。并且它的内容是只读的。

我们有时候经常会看到两个字符串类型,一个是“Sting”,一个是“string”。大写的String是System.String,也就是 公共语言规范(Common Language Specification) CLS 所定义的字符串类型;小写的string则是C#自己的字符串类型;最终C#编译器还是会把它和System.String联系起来。

例如:

string a = "a";
a = "abc";

我们来简单分析下这两段代码:

1.第一段代码,首先会在托管堆上分配一块内存,用来存储“a”,然后将该对象的首地址保存到变量a中。(如果驻留池中有“a”,就可以直接取出)

2.第二段代码,会在托管堆上重新分配一块内存,用来储存“abc”,然后修改变量a的值,使它指向该对象的首地址。

需要注意的是,string类型提供了许多的静态和实例的方法,比如ToUpper,Concat等;这些方法都返回一个新的字符串。这些新的字符串要么是新建的,要么是从字符串驻留池中去出来的,与原字符串无关。

好了,现在让我们来看看“字符串驻留池”(Intern Pool)。顾名思义,凡是看到什么什么池之类的东西,都能猜到字面肯定存着许多对象,就是为了反复使用,避免我们自己重新new。每个进程都有自己的字符串驻留池,所以i它们之间互不影响。

我们先来看一个例子:

string a1 = "a";
string a2 = "a"; //"a"已经存在于驻留池中,直接取出
string a3 = new string('a', ); Console.WriteLine(ReferenceEquals(a1, a2));
Console.WriteLine(ReferenceEquals(a1, a3));

我们运行完这段代码之后就可以得到,第一输出True,第二个输出False。输出True,是因为直接使用的驻留池中的字符串;但是为什么第二个输出是False呢?

因为:CLR在程序执行的时候,首先会把嵌入到源代码中的文本常量字符串加入到“字符串驻留池”中;但是,程序中动态创建的字符串却不会被加入。

浅谈String类型的更多相关文章

  1. 浅谈String、StringBuffer与StringBuilder

    浅谈String.StringBuffer与StringBuilder   先详细介绍一下String.StringBuffer与StringBuilder String: 官方对String的说明: ...

  2. C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)

    STL实践与分析 --再谈string类型(下) 四.string类型的查找操作 string类型提供了6种查找函数,每种函数以不同形式的find命名.这些操作所有返回string::size_typ ...

  3. 转:浅谈char类型范围

    在 C 语言中, signed char 类型的范围为 -128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是 -128~127,这个问题貌似看起来也很简单容易, 以 ...

  4. 浅谈String中的==和对象中引用对象类型的==

    @Test public void test02() { StringBuffer sb = new StringBuffer(); sb.append('a'); sb.append(11); Sy ...

  5. 浅谈string

    #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 using std::string;using ...

  6. 浅谈 String 的 hashCode() 方法

    Java 中 hash 值的含义 hash 值主要是用来在散列存储结构中确定对象的存储地址的,提高对象的查询效率,如HashMap.HashTable等: 如果两个对象相同,那么这两个对象的 hash ...

  7. 浅谈String模块ascii_letters和digits

    本文介绍string模块ascii_letters和digits方法,其中ascii_letters是生成所有字母,从a-z和A-Z,digits是生成所有数字0-9. 示例如下: In [2]: c ...

  8. C++ string (浅谈)

    浅谈string <string> typedef basic_string<char> string; 本篇主要内容是简单地介绍 string类 在竞赛方面较实用的一些功能, ...

  9. 浅谈Kotlin(二):基本类型、基本语法、代码风格

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...

随机推荐

  1. cocos2d-x lua与c++简单交互

    cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...

  2. 解决TableView / ScrollView上的Menu问题(1滑出View区域还可点击2导致点击menu后View不能滑动)

    解决TableView / ScrollView上的Menu问题 1划出区域还可点击 重写CCMenu的触摸事件函数 TouchBegin/TouchMove/TouchCancle/TouchEnd ...

  3. mysql颠覆实战笔记(六)--商品系统设计(三):商品属性设计之固定属性

    今天我们来讲一下商品属性 我们知道,不同类别的商品属性是不同的. 我们先建一个表prod_class_attr:

  4. java.lang.IllegalArgumentException: Service Intent must be explicit: Intent

    在Activity中启动Service的时候报错: 服务意图必须是显性声明. 这是为了防止造成冲突(i.e. 有多个Service用同样的intent-filter的情况) 这是Android 5.0 ...

  5. CSS3 伸缩布局盒模型记

    CSS3 伸缩布局盒模型 CSS3引入的布局模式Flexbox布局,主要思想是让容器有能力让其子项目能够改变其宽度,高度,以最佳方式填充可用空间.Flex容器使用Flex项目可以自动放大与收缩,用来填 ...

  6. Commons JXPath - DOM/JDOM Document Access

    除了 JavaBean,JXPath 也可以访问 DOM/JDOM. 示例 XML: <?xml version="1.0" encoding="utf-8&quo ...

  7. 【转载】Kafka High Availability

    http://www.haokoo.com/internet/2877400.html Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则 ...

  8. 浅谈.NET中加密和解密的实现方法分享

    这篇文章介绍了.NET中加密和解密的实现方法,有需要的朋友可以参考一下 .NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利.它将CryptoAPI改编进.NET的Syste ...

  9. jQuery之对话框

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  10. struts2文件上传(保存为BLOB格式)

    html文件:提供上传文件的入口 <input type="file" name="upload"><!-- name很重要,与后面actio ...