当在一个循环中将许多字符串连接在一起时,使用 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
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级