C#字符串地址问题,请指教!
static void Main(string[] args)
{
string A = "hello " + "world ";
string B = "helloworld ";
A = "hello ";
Console.Write(B);
Console.ReadLine();
}
A 和 B 的地址 是一样的:
ILDASM的内容:
.method /*06000001*/ private hidebysig static
void Main(string[] args) cil managed
{
.entrypoint
// Code size 33 (0x21)
.maxstack 1
.locals /*11000001*/ init ([0] string A,
[1] string B)
IL_0000: nop
IL_0001: ldstr "helloworld " /* 70000001 */
IL_0006: stloc.0
IL_0007: ldstr "helloworld " /* 70000001 */
IL_000c: stloc.1
IL_000d: ldstr "hello " /* 70000017 */
IL_0012: stloc.0
IL_0013: ldloc.1
IL_0014: call void [mscorlib/*23000001*/]System.Console/*01000012*/::Write(string) /* 0A000010 */
IL_0019: nop
IL_001a: call string [mscorlib/*23000001*/]System.Console/*01000012*/::ReadLine() /* 0A000011 */
IL_001f: pop
在把 hello 附给A 的时候 A 是不是另开辟的一个空间?
不然输出的B 为什么不是Hello?
------解决方案--------------------是的
虽然A跟B初时都是 "helloworld ",但是是不同的引用,他们是没有关系的,所以你文的B的输出跟A扯不上任何关系
------解决方案--------------------那是当然,其实.net是这样作的。
原则:如果内存有那个空间,就指向它,如果没有,创建再指向。
------解决方案--------------------原则:如果内存有那个空间,就指向它,如果没有,创建再指向。
学习。。。。。
------解决方案--------------------.net中的string类型是一种只读的引用类型
string s = "ABC "
s = "12345 "
这里实际上分配了两段内存 一个用来存放ABC 当你改变s的值时 实际上是新分配一段内存 值为12345 然后把s的指向指到了这个新的内存段 以前那段不能找到了 只有等待垃圾回收
------解决方案--------------------所以遇到变化频率比较大的字符串的操作 建议使用stringBuilder类来代替string类型
------解决方案--------------------