日期:2014-05-20  浏览次数:20750 次

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类型
------解决方案--------------------