前两节我们介绍了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应该有全新的认识了吧!

转自:http://www.cnblogs.com/isline/archive/2009/02/04/1383835.html

.Net Discovery 系列之二--string从入门到精通(下)的更多相关文章

  1. Python基本语法[二],python入门到精通[四]

    在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解. ...

  2. .Net Discovery 系列之一--string从入门到精通(上)

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...

  3. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)

    上期我们完成了一个简单的主从页面,但是页面是静态的,不能交互,功能也很简单,只有一个销售订单的列表. 我们今天就一鼓作气把代码全都写完,由于本次的代码量较大,所以只对重点代码部分进行讲解. 具体每个文 ...

  4. 深入浅出Mybatis系列(二)---Mybatis入门

    一.Mybatis环境搭建及简单实例 1. 新建web项目, 添加依赖包:mybatis包.数据库驱动包(我使用的是mysql).日志包(我使用的是log4j), 由于我的是maven项目, 那么添加 ...

  5. BI商业智能培训系列——(二)SSIS入门

    简介: SSIS,Microsoft SQL Server Integration Services.Integration意为"整合"."一体化".上篇博客中 ...

  6. Python基本语法[二],python入门到精通[四] (转)

    写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 回到顶部 v正文开始:Python基本语法 1.定义常量: 之所以上篇博客介绍了定义变量没有一起介绍定义常量,是因为Pyt ...

  7. Jmeter(二十) - 从入门到精通 - JMeter监听器 -下篇(详解教程)

    1.简介 监听器用来监听及显示JMeter取样器测试结果,能够以树.表及图形形式显示测试结果,也可以以文件方式保存测试结果,JMeter测试结果文件格式多样,比如XML格式.CSV格式.默认情况下,测 ...

  8. Jmeter(二十一) - 从入门到精通 - JMeter断言 - 上篇(详解教程)

    1.简介 最近由于宏哥在搭建自己的个人博客可能更新的有点慢.断言组件用来对服务器的响应数据做验证,常用的断言是响应断言,其支持正则表达式.虽然我们的通过响应断言能够完成绝大多数的结果验证工作,但是JM ...

  9. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)

    1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...

随机推荐

  1. 关于sru源码class Model的parameters

    class Model(nn.Module): def __init__(self, words, args): super(Model, self).__init__() self.args = a ...

  2. MySQL 5.6 Replication 复制 FAQ

    原文请参照MySQL官方文档Reference Manual,版本5.6.10. 复制功能使得数据可以从一个MySQL数据库(master主库)复制到另一个或多个MySQL数据库(slave从库).缺 ...

  3. python try详细说明(python的异常捕捉模块)

    #自己常用 try: pass except Exception as e: print("break for :"+str(e)) # 划重点: 1. 正常执行try情况 pri ...

  4. oracle数据库_实例_用户_表空间之间的关系

    基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库:Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库的 ...

  5. sysbench安装及性能测试

    现在的压力测试工具各种各样,只要上手好几款功能强大点的而且比较大众化的压力测试工具即可,以下跟大家交流下sysbench的安装和压力测试 sysbench支持以下几种测试模式: 1.CPU运算性能 2 ...

  6. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果

    前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...

  7. JavaScriptSerializer中日期序列化解决方案

    后台代码: JavaScriptSerializer _jsSerializer = new JavaScriptSerializer(); ViewBag.ProcName = ProcInst.P ...

  8. PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

    php5.2.x php5.3.x php5.4.x php5.5.x php5.6.x 对比详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已 ...

  9. .NetCore中使用ExceptionLess 添加操作日志

    上一篇文章已经扩展了日志,下面我们在结合下处理操作日志 通常我们想到操作日志 可能想到的参数可能有 模块 方法 参数内容 操作人 操作时间 操作 Ip 下面我们就来结合这些信息添加操作日志 如果要在代 ...

  10. centos7配置svn钩子hooks脚本自动同步代码到项目目录

    由于项目需要,svn提交后的代码希望再测试服务器上测试,每次提交后还要手动去svn update一次 十分麻烦,配置好svn钩子以后就省去了这些麻烦. 进入svn版本库目录找到hooks目录找到文件p ...