仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 499|回复: 7
打印 上一主题 下一主题

[学习教程] NET网页编程之C#中String与StringBuilder功能差别的缘故原由详解

[复制链接]
再见西城 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:21:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。System.String是C#基本范例中独一的援用范例。可是,它却具有良多值范例的特性。

我们来看一段复杂的代码:
stringtext="Red";
string_tempStr=text;
_tempStr="Blue";
Console.WriteLine(text);
Console.ReadKey();
依照援用的实际,此处_tempStr变量应当是存储的text变量的地点,那末修正_tempStr变量的值,text的值就应当随之改动。
那末,此时text变量的值应当就是"Blue",但现实上经由测试text变量的值仍是"Red"。
那就申明_tempStr变量一定不是存储的text变量的地点。但,如许又违反了它是援用范例的这一特性,那它的外部事实是怎样处置的呢?

据我懂得,微软应当是在String范例中引进了Copy-On-Write(写时拷贝)手艺,先来扼要申明一下甚么是Copy-On-Write手艺:
复杂来讲,在复制一个工具时并非真的在内存中把本来工具的数据复制一份到别的一个地点,而是在新工具的内存映照表中指向同原工具不异的地位,而且把那块内存的Copy-On-Write位设为1。在对这个工具实行读操纵的时分,内存数据没有变化,间接实行就能够。在写的时分,才真正将原始工具复制一份到新的地点,修正新工具的内存映照表到这个新的地位,然后往这里写。

有必定履历的程序员应当都晓得,Copy-On-Write(写时拷贝)手艺利用了"援用计数"体例,会有一个变量用于保留援用的数目。
当第一个类机关时,String的机关函数会依据传进的参数从堆上分派内存,当有别的类必要这块内存时,这个计数为主动累加。
当有类析构时,这个计数会减一,直到最初一个类析构时,此时的援用计数为1或是0,此时,程序才会真实的开释这块从堆上分派的内存。
说白了,"援用计数"就是String类中写时拷贝的道理!
现实上,String仍是一个不成变的数据范例,一旦对String范例的工具举行了初始化,该字符串工具就不克不及改动了。

为了申明这一点,我们再来看一小段很复杂的代码:
stringname="XXXXXX";
name+="isagentleman.";
在实行这段代码时,起首创立一个名为name的String范例的工具,并初始化为"XXXXXX"。
此时,.NET运转库会为该字符串分派充足的内存来保留这个文本,然后,再设置变量name,来暗示这个字符串实例。
从语法上看,第二行代码是将更多的文本增加到此字符串中。在我初学C#言语的时分,我也是这么了解的。
实践上却并不是云云,而是创立一个新的字符串实例,给他分派充足的内存,然后存储兼并的一切文本。
把第一行代码中的文本:"XXXXXX"复制到新字符串中,再加上第二行代码中的文本:"isagentleman."。
然后更新存储在name变量中的内存地点,使变量准确的指向新的字符串工具。旧的字符串工具被烧毁了援用,并守候体系接纳。
如许的体例自己并没有成绩,可是假如必要频仍的举行字符串的操纵的话,那就存在极年夜地功能成绩。

因而,为懂得决这一成绩,微软推出了System.Text.StringBuilder类。在StringBuilder类中,仅限于交换、增加和删除字符串中文本的操纵,但它的效力远远高于String。
StringBuilderstringBuilder=newStringBuilder(30,300);
StringBuilder类在初始化的时分,供应很多机关函数用来初始化以后实例的初始巨细和可存储的最年夜字符数和用来初始化以后实例的字符串。

实践上,当我们创立StringBuilder工具的时分,.NET运转库会为以后的工具在内存平分配一块缓存地区,用以对字符串操纵的预留空间。在利用StringBuilder类的时分,最好将容量设置为字符串大概的最年夜长度,确保StringBuilder不必要反复分派内存。假如字符的容量凌驾设置的最年夜容量,.NET运转库将主动分派内存并翻倍。

关于我们.NET程序员而言,StringBuilder与String的分歧的地方就在于,StringBuilder能够显现的设置分派内存的巨细,而String只能依据你初始化时的字符串的巨细由体系分派充足的内存。

以是,当要对字符串举行频仍的操纵的时分,在String和StringBuilder之间,我们应当选择StringBuilder。归根到底,Java跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢!
莫相离 该用户已被删除
沙发
发表于 2015-1-18 13:24:32 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
因胸联盟 该用户已被删除
板凳
发表于 2015-1-23 22:10:49 | 只看该作者
比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
活着的死人 该用户已被删除
地板
发表于 2015-1-31 20:44:13 | 只看该作者
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
山那边是海 该用户已被删除
5#
发表于 2015-2-19 09:00:53 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
简单生活 该用户已被删除
6#
发表于 2015-3-6 14:48:39 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
海妖 该用户已被删除
7#
发表于 2015-3-13 03:10:37 | 只看该作者
ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。
爱飞 该用户已被删除
8#
发表于 2015-3-20 11:33:50 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-27 16:53

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表