.Net Discovery 系列之二--string从入门到精通(下)
前两节我们介绍了string的两个基本特性,如果你觉得你已经比较全面的了解了string,那么就来看看这第3、4两节吧。
三.有趣的比较操作
在第一节与第二节中,我们分别介绍了字符串的恒定性与与驻留性,如果这位同学友觉得完全掌握了以上内容,那么就在第三节中检验一下自己的学习成果吧!
以下10段简单的代码将通过值比较与地址引用比较,来说明前两节讲到的内容,大家也可以通过这些代码来检测一下自己对string的了解程度。
代码一:
string a = "str_1";
string b = "str_1";
Response.Write(a.Equals(b));
Response.Write(ReferenceEquals(a,b));
输出:True (Equals比较字符串对象的值)
True (ReferenceEquals比较字符串对象的引用,由于字符串驻留机制,a与b的引用相同)
代码二:
string a = "str_1str_2";
string b = "str_1";
string c = "str_2";
string d = b + c;
Response.Write(a.Equals(d));
Response.Write(ReferenceEquals(a, d));
输出:True(Equals比较字符串对象的值)
False(ReferenceEquals比较字符串对象的引用,由于变量d的值为变量连接的结果,字符串驻留机制无效)
代码三:
string a = "str_1str_2";
string b = "str_1" + "str_2";
Response.Write(a.Equals(b));
Response.Write(ReferenceEquals(a, b));
输出:True(Equals比较字符串对象的值)
True (ReferenceEquals比较字符串对象的引用,由于变量b的值为常量连接的结果,字符串驻留机制有效。如果变量b的值由“常量+变量”的方式得出,则字符串驻留无效)
代码四:
string a = "str_1";
string b = String.Copy(a);
Response.Write(a.Equals(b));
Response.Write(ReferenceEquals(a, b));
输出:True(Equals比较字符串对象的值)
False (ReferenceEquals比较字符串对象的引用,Copy操作产生了新的string对象)
代码五:
string a = "str_1";
string b = String.Copy(a);
b = String.Intern(b);
Response.Write(a.Equals(b));
Response.Write(ReferenceEquals(a, b));
输出:True(Equals比较字符串对象的值)
True (ReferenceEquals比较字符串对象的引用,String.Intern实现了字符串驻留)
代码六:
string a = "str_1";
string b = String.Copy(a);
string c = "str_1";
Response.Write((object)a == (object)b);
Response.Write((object)a == (object)c);
输出:False (“==”在两边为引用类型时,则比较引用的地址,所以a与b为 不同引用)
True (ReferenceEquals比较字符串对象的引用,a与c由于字符串驻留机制,引用相同)
代码七:
string a = "str_1";
string c = "str_1";
Response.Write(a == c);
输出:True
刚才我们提到过,“==”在两边为引用类型时,则比较引用的地址;如果是值类型时则需要比较引用和值。string为引用类型,那么上面的代码是比较了变量a与c的地址还是地址和值呢?答案是:比较了地址和值!因为在string类型比较的时候,“==”已经被重载为“Equals”了,所以,虽然你在用“==”比较两个引用类型,但实际上是在用“Equals”比较它们的地址和值!(先比较地址,地址不等再比较值)
代码八:
string a = "a";
string b = new string('a', 1);
Response.Write(a.Equals(b));
Response.Write(ReferenceEquals(a, b));
输出:True (Equals比较值,a与b的值相同)
False (ReferenceEquals比较字符串对象的引用)
代码九:
string a = "a";
string b = new string('a', 1);
Response.Write(a.Equals(string.Intern(b)));
Response.Write(ReferenceEquals(a, string.Intern(b)));
输出:True (Equals比较值,无论是否Intern都会相同)
True (ReferenceEquals比较字符串对象的引用,Intern已经将b驻留至字符串池内)
代码十:
string a = "str";
string b = "str_2".Substring(0,3);
Response.Write(a.Equals(b));
Response.Write(ReferenceEquals(a, b));
输出:True (Equals比较值,a与c的值相同)
False (ReferenceEquals比较字符串对象的引用,Substring操作产生了新的字符串对象)
此段代码产生了3个string对象,是哪3个呢?如果你不明白,还是从头再看一遍吧!
四.艺海拾贝
这一节将主要给大家介绍一些string的常见问题。
1.“string = ”与“new stirng()”的区别
string test = "a";
string test = new string('a', 1);
以上两行代码的效果是一样的,它们的区别在于加载”a”的时间不同:第一行的“a”是一个常量,在编译期就已经被放在一个叫做常量池的地方了,常量池通常装载一些在编译期被确定下来的数据,例如类、接口等等;而第二行是运行时CLR在堆中生成的值为“a”的字符串对象,所以后者没有字符串驻留。
2. string 与 String的区别
String的大名叫做System.String,在编译为IL代码时,string和System.String会生成完全相同的代码:(ps:long和System.Int64,float和System.Single等也有此特性)
C#代码:
string str_test = "test";
System.String Str_test = "test";
IL码:
// 代码大小 14 (0xe)
.maxstack 1
.locals init ([0] string str_test,
[1] string Str_test)
IL_0000: nop
IL_0001: ldstr "test"
IL_0006: stloc.0
IL_0007: ldstr "test"
IL_000c: stloc.1
IL_000d: ret
所以,二者的区别并不在于底层,而是在于string是类似于int的基元类型;System. String是框架类库(FCL)的基本类型,二者之间有直接的对应关系。
3.StringBuilder
StringBuilder提供了高效创建字符串的方法,由StringBuilder表示的字符串是可变的(非恒定的),在需要多处使用“+”连接字符串变量的时候,推荐使用StringBuilder来完成,最后调用其ToString()方法输出。当调用了StringBuilder的ToString()方法之后,StringBuilder将返回其内部维护的一个字符串字段引用,如再次修改StringBuilder,它将会创建一个新的字符串,这时被修改的是新的字符串,原来已经返回的字符串才不会发生改变。
StringBuilder有两个比较重要的内部字段,大家需要掌握:
m_MaxCapacity:StringBuilder的最大容量,它规定了最多可以放置到 m_StringValue的字符个数,默认值为Int32.MaxValue。m_MaxCapacity一旦被指定就不能再更改。
m_StringValue:StringBuilder维护的一个字符数组串,实际上可以理解为一个字符串。StringBuilder重写的Tostring()方法返回的就是这个字段。
讲到这里,你已经掌握了string的大部分秘密,怎么样,你对string应该有全新的认识了吧!
我是李鸣(Aicken) 请您继续关注我的下一篇文章。
转载于:https://www.cnblogs.com/isline/archive/2009/02/04/1383835.html
.Net Discovery 系列之二--string从入门到精通(下)相关推荐
- 艾伟_转载:.NET Discovery 系列之二--string从入门到精通(勘误版下)
本系列文章导航 .NET Discovery 系列之一--string从入门到精通(上) .NET Discovery 系列之二--string从入门到精通(勘误版下) .NET Discovery ...
- .Net Discovery 系列之九--string从入门到精通(勘误版下)
string可以说是.Net中比较复杂的一种数据类型,很多文章介绍过它,但不是很全面,本文全面的介绍了string的各种内部机制与特性,欢迎点评.本文为修正版,对前文进行了一些勘误,感谢地狱门神. A ...
- paddlepaddle系列之三行代码从入门到精通
PaddlePaddle系列之三行代码从入门到精通 前言 这将是PaddlePaddle系列教程的开篇,属于非官方教程.既然是非官方,自然会从一个使用者的角度出发,来教大家怎么用,会有哪些坑,以及如何 ...
- PaddlePaddle 系列之三行代码从入门到精通
本文介绍 PaddlePaddle 系列之三行代码从入门到精通. 前言 这将是 PaddlePaddle 系列教程的开篇,属于非官方教程.既然是非官方,自然会从一个使用者的角度出发,来教大家怎么用,会 ...
- python语法基础语法_Python基本语法[二],python入门到精通[四]
在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...
- 云开发系列课程让你从入门到精通快速上手Serverless和云开发技术
简介:云开发系列课程主要介绍了从入门到精通快速上手Serverless和云开发技术.学习内容涵盖云开发协同.云函数.云数据库.多媒体托管.前后端一体化框架等Serverless Web开发必备知识.希 ...
- VC知识库视频大讲坛系列之GDI GDI+从入门到精通
第1章 <GDI GDI+从入门到精通视频> 第1节<GDI GDI+从入门到精通>前言 第2节<GDI GDI+从入门到精通>第一讲 第3节<GDI GDI ...
- .Net Discovery 系列之一--string从入门到精通(上)
string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...
- elasticsearch从入门到入门系列(二)---快速入门C
1.分词器的介绍和使用 什么是分词器 将用户输入的一段文本,按照一定逻辑,拆分为多个词语的一种工具 常见的内置分词器 standard analyzer:标准分析器器是默认分词器器,如果未指定,则使⽤ ...
最新文章
- PHP如何更好的利用PHPstorm的自动提示
- 从运维域看 Serverless 真的就是万能银弹吗?
- C#中的String编码转换
- 中国软件开发工程师之痛
- leetcode 380. Insert Delete GetRandom O(1) | 380. O(1) 时间插入、删除和获取随机元素(Java)
- 玩转mini2440开发板之【编译u-boot提示没有规则可以创建“XX.o”需要的目标】
- 他毕业于北师大,编写了我国首套数学教材,陈景润华罗庚都崇拜他
- 为什么程序员发现不了自己的BUG?
- django系列5.1--ORM对数据库的操作
- 2015年4月7号的日志
- Linux下修改系统时间的简单方法
- python中常见的三种选择结构_循序渐进学Python:三种选择语句
- 软件工程-软件开发的工程思维
- Ubuntu下面steam的安装
- Python数学问题17:鸡兔同笼问题
- 关于python异常处理、以下说法正确的是_以下关于Python高级特性说法正确的是(_____)。...
- 数据挖掘的过程是什么?通俗易懂
- 关于outlook 保存的.msg文件打开一次之后不能再次打开的问题
- 如何查看html的字体,如何检测网页中使用了哪种定义的字体?
- 【智能优化算法】基于倭黑猩猩优化算法求解单目标优化问题附matlab代码
热门文章
- 死磕java并发cas_死磕Java——CAS
- sqlplus中调用shell_(转)shell 调用sqlplus各种情况示例
- php 使用压缩css文件,PHP-使用GZIP压缩静态CSS文件
- ubuntu导入第三方库_ubuntu用户切换、配置Python开发环境与所需的第三方库
- mysql join 组合索引_详解MySQL两表关联的连接表创建单列索引还是组合索引最优...
- 5.2k Star!一款 Python 实现的美观终端资源监视器
- 移动并重命名2000个文件,Python,3秒
- 周董新歌搞崩QQ,透过20W评论,看看歌迷在说啥
- 30 本 Python 新书《谁说菜鸟不会数据分析》,包邮送到你手上!!
- ​你可能不太会用的10个Git命令