街角转弯处

用行动向世界证明存在的价值, 用实力打造真实的生命寓言.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DotNet C#中字符串变量与内存地址的关关系

Posted on 2007-04-23 13:15  马路灯  阅读(1758)  评论(0编辑  收藏  举报
 

在很多网上资料中看到, 关于net中的string(字符串)变量的特性说明:
在net中string变量一但被赋值后就不可再对其值进行修改, 这是什么意思呢? 我们又如何去理解当中的"值不可修改"的说法呢?

首先, 我们知道, 当我们定义一个字符串变量并给它赋值时, 系统会分配一个内存空间给该变量用于存放数据, 如下面代码

string a;
string b;
a = "ABCD";
b = a:
a="EEEE"
Console.WriteLine(a);
Console.WriteLine(b);

运行结果是:
a: EEEE
b: ABCD


在这里我们定义了两个字符串变量a和b, 当给a赋值时, 系统就在内存中分配了一个内存地址空间给变量a存放此数据, 而此时a就被指向了. 而当把a的值赋予变量b时, 此时系统不会分配一个新的内存空间给变量b了,而是直接将变量b指向变量a的内存地址,从而节约内存资源,此时b的值就是"ABCD",     接下来改变a的值为”EEEE”, 说到这里一些朋友可能会说, 从输出结果可以看出a的值不就从原来的"ABCD"改成了"EEEE"了吗?不就改了a的值了吗? 呵呵, 其实一开始我也是这样想的, 但细想一下,  上面a和b都是指向了相同的内存地址,那如果a的值被改写了, 那是不是a所指向的内存地址上面的内容就被改变了?这样一来不就连同样是指向于这个内存地址的变量b的值也跟着一起被改变了, 但从上面的代码中我们可以看到, 最后输出的a,b两个变量值是不相同的, 在dotnet这个内存管理模式中, 只就一种可能性就是当我们给变量a  的值发生改变, 系统就给它分配了一个新内存空间,确保资源的最大利用率

,