登陆 免费注册 提交网站
站长资讯 >> 站长学院 >> 网络编程
 2013-05-29 23:36浏览: 1180 次

asp.NET 中String 和StringBuilder 区别详解

当在一个循环中将许多字符串连接在一起时,使用 stringbuilder 类可以提升性能,为什么呢?最大区别在于他们的内存分配机制不同。

内存分配:

string

string 对象是不可改变的。每次使用 string 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间

stringbuilder

stringbuilder 实例的 int capacity 属性,它表示内存中为存储字符串而物理分配的字符串总数。该数字为当前实例的容量。当字符串操作的结果大于当前的容量时,该属性的值会自动增长。增长的幅度为当前数值的2倍。

注: .net framework中可变集合类如arraylist 的capacity 属性也类似这种自动分配机制

ok 既然说到string 顺便介绍下string对象的引用比较问题

猜猜下面这段代码将会输出什么结果??

以下内容为程序代码:

public void test1()

{

string a = "abcd";

string b = "abcd";

/**

* object.referenceequals(object obja, object objb);

* 返回结果:

* 如果 obja 是与 objb 相同的实例,或者如果二者都为空引用,则为 true;否则为 false。

* ***/

console.writeline(object.referenceequals(a,b));

}

这段代码将输出

true

是的不信你可以自己验证一下,因为在你代码中定义"abcd" 的时候系统就已经为这个字符串实例分配了内存,这里的"abcd"将作为一个实例对象存储在内存中,在下方又用到了这个字符串,所以系统直接将它的引用赋值给了b变量

再来一段,猜猜这个将会输出什么结果?

public static void main(string[] args)

{ string a = "abeqwec";

string b = "abeqwe" + "c";

string c = "abeqwec";

console.writeline(object.referenceequals(a,c));

console.writeline(object.referenceequals(a,b));

console.writeline(object.referenceequals(b,c));

console.readline();

}

il 代码

.method public hidebysig static void main(string[] args) cil managed

{

.entrypoint

.maxstack 2

.locals init (

[0] string a,

[1] string b,

[2] string c)

l_0000: nop

l_0001: ldstr "abeqwec"

l_0006: stloc.0

l_0007: ldstr "abeqwec"

l_000c: stloc.1

l_000d: ldstr "abeqwec"

l_0012: stloc.2

l_0013: ldloc.0

l_0014: ldloc.2

l_0015: call bool [mscorlib]system.object::referenceequals(object, object)

l_001a: call void [mscorlib]system.console::writeline(bool)

l_001f: nop

l_0020: ldloc.0

l_0021: ldloc.1

l_0022: call bool [mscorlib]system.object::referenceequals(object, object)

l_0027: call void [mscorlib]system.console::writeline(bool)

l_002c: nop

l_002d: ldloc.1

l_002e: ldloc.2

l_002f: call bool [mscorlib]system.object::referenceequals(object, object)

l_0034: call void [mscorlib]system.console::writeline(bool)

l_0039: nop

l_003a: call string [mscorlib]system.console::readline()

l_003f: pop

l_0040: ret

}

由此可见在进行编译为il代码之前,编译器已经将字符串做了链接,所以对我们的运行结果将不会有影响

以上代码 输出

true

true

true

网站首页 - 关于我们 - 联系我们 - 友情链接 - 帮助中心
Copyright ©2007-2022 www.Aisila.com All Rights Reserved
苏ICP备20008864号-4