`
baobeituping
  • 浏览: 1043549 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

.net 如何高效地使用string(转)

    博客分类:
  • .NET
阅读更多

string是恒定的(immutable)

和其他类型比较,string最为显著的一个特点就是它具有恒定不变性:我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。

String的恒定性具有很多的好处,它首先保证了对于一个既定string的任意操作不会造成对其的改变,同时还意味着我们不用考虑操作string时候出现的线程同步的问题。在string恒定的这些好处之中,我觉得最大的好处是:它成就了字符串的驻留。

CLR通过一个内部的interning table保证了CLR只维护具有不同字符序列的string,任何具有相同字符序列的string所引用的均为同一个string对象,同一段为该string配分的内存快。字符串的驻留极大地较低了程序执行对内存的占用。

对于string的恒定性和字符串的驻留,还有一点需要特别指出的是:string的恒定性不单单是针对某一个单独的AppDomain,而是针对一个进程的。

下面简单介绍一些高效地使用string的一些小的建议:

1. 尽量使用字符串(literal string)相加来代替字符串变量和字符创相加,因为这样可以使用现有的string操作指令进行操作和利用字符串驻留。

比如:

string s = "abc" + "def";

优于

string s = "abc";
= s + "def";

2. 在需要的时候使用StringBuilder对string作频繁的操作:

由于string的恒定性,在我们对一个string进行某些操作的时候,比如调用ToUpper()或者ToLower()把某个string每个字符转化成大写或者小写;调用SubString()取子串;会创建一个新的string,有时候会创建一些新的临时string。这样的操作会增加内存的压力。所有在对string作频繁操作的情况下,我们会考虑使用StringBuilder来高效地操作string。StringBuilder之所以能对string操作带来更好的performance,是因为在它的内部维护一个字符数组,而不是一个string来避免string操作带来的新的string的创建。

StringBuilder是一个很好的字符累加器,我们应该充分地利用这一个功能:

StringBuilder sb = new StringBuilder();
sb.Append(str1 
+ str2);

最好写成

StringBuilder sb = new StringBuilder();
sb.Append(str1);
sb.Append(str2);

避免创建一个新的临时string来保存str1 + str2。

再比如下面的Code

StringBuilder sb = new StringBuilder();
sb.Append(WorkOnString1());
sb.Append(WorkOnString2());
sb.Append(WorkOnString3());

最好写好吧WorkOnString1,WorkOnString2,WorkOnString3定义成:

WorkOnString1(StringBuilder sb)
WorkOnString2(StringBuilder sb)
WorkOnString3(StringBuilder sb)

3. 高效地进行string的比较操作

我们知道,对象之间的比较有比较Value和比较Reference之说。一般地对Reference进行比较的速度最快。对于string,在字符串驻留的前提下,我们可以把对Value的比较用Reference的比较来代替从而会的Performance的提升。

此外,对于忽略大小写的比较,我们最好使用string的static方法Compare(string strA, string strB, bool ignoreCase)。也就是说:

if(str1.ToLower()==str2.ToLower())

最好写成

If(string. Compare(str1,str2,true))
分享到:
评论

相关推荐

    .net 稳定 高效 易用 可同步 TCP 通信框架

    .net 稳定 高效 易用 可同步 TCP 通信框架 使用平台: WinXP,WIN7,WIN8,WINCE,WINPHONE。 使用.net 2.0 框架。 主要功能介绍: 1、可以代替 Oracle,Mysql客户端 在不安装Oracle,MySql客户端的情况下访问, ...

    asp.net知识库

    .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎...

    亮剑.NET深入体验与实战精要2

    2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 ...

    ASP.NET的网页代码模型及生命周期

    在ASP.NET中,能够使用面向对象的思想和软件开发中的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP.NET中最重要的概念---网页代码模型。 4.1 ASP.NET的网页代码模型 在ASP.NET应用程序开发...

    亮剑.NET深入体验与实战精要3

    2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 ...

    支持.Net Core的ZooKeeper异步客户端.zip

    该项目使用了 Apache ZooKeeper .NET async Client 组件,除提供了基本的zk操作,还额外封装了常用的功能以便让.net开发者更好的使用zookeeper。 提供的功能 session过期重连 永久watcher 递归删除...

    asp.net高效替换大容量字符实现代码

    一般进行替换操作都这样: 代码如下:str=str.replace(字符串一,字符串二) 不难发现一个问题,如果str要循环... 代码如下:public Regex returnMatch(String str)//匹配正则 { Regex r; r = new Regex(@str,RegexOptions

    详解免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍...NPOI是完全免费使用; 涵盖Excel的大多数功能(单元格样式,数据格式,公式等);支持xls,xlsx,docx;设计为面向接口(看看

    详解高效而稳定的企业级.NET Office 组件Spire(.NET组件介绍之二)

    在项目开发中,尤其是企业的...软件开发的目地是对使用者便捷,但这一要求未必对开发者来说也是便捷的。 在前面介绍过一款开源免费的组件DocX,这个组件主要是对文档进行操作。另一种对Excel操作的组件NPOI组件。今天介

    asp.NET中实现文件的压缩和解压(3种方式)

    在.NET可以通过多种方式实现zip的压缩和解压:1、使用System.IO.Packaging;2、使用第三方类库;3、通过 System.IO.Compression 命名空间中新增的ZipArchive、ZipFile等类实现。 一、使用System.IO.Packaging压缩和...

    高效.NET脏字过滤算法与应用实例

    本文实例讲述了高效.NET脏字过滤算法。分享给大家供大家参考,具体如下: BadWordsFilter.cs类 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Collections;...

    .net core高吞吐远程方法如何调用组件XRPC详解

    前言 XRPC的目标非常明确,就是给.net core平台实现一个百万级别的远程方法调用RPC通讯组件。它的设计理念和GRPC一样,...二进制处理并没有像GPRC一样使 Protobuf,而是使用了在.net core平台下相对更高效的组件Message

    Mastering-C-Sharp-and-.NET-Framework:精通C#和.NET Framework的代码包

    ##关于书籍精通C#和.NET Framework将带您深入C#6.0和.NET 4.6,因此您可以了解平台在运行代码时的工作方式,以及如何使用这些知识来高效编写代码应用程序。 充分利用.NET开发的新革命,包括开源状态和跨平台功能...

    C#考试题目大全(共167页)

    1. __________是独立于CPU 的指令集,它可以被高效地转换为特定于某种 CPU 的代码。(C) A.CLR(公共语言运行库) B.CLS(公共语言规范) C.MSIL(微软中间语言) D.CTS(通用类型系统) 2. 在 Visual Studio.NET 窗口...

    C#(VS2010环境) GDI 高效绘曲线图dll

    3、按顺序申明线段名称(例如:string[] Field = new string[] { "线a", "线b" }; 4、申明Chart对象(例如:Chart chart;) 5、构造Chart对象(例如:chart = new Chart(Field);) 6、更新需要...

Global site tag (gtag.js) - Google Analytics