string s = "1"; //内存堆中的一块空间,地址1
Object o = s;  //内存堆中一块新空间地址2,存放一个指针指向地址1
Object o1 = o;  //内存中一块新空间地址3,存放一个指针,指向地址2
o = "2";       //内存中一块新空间地址4,目前没有其他指针指向这个地址按如上理解对吗?按以上o1应该还等于"1",其实我希望如下在内存堆中有一个字符串"aaa",然后在内存堆中开辟一个新空间,指向"aaa"这个空间,我希望当"aaa"改变为"bbb"时,新空间显示的值也会改变为"bbb",类似于指针,应该如何操作,

解决方案 »

  1.   

    装箱和拆箱其实就是值类型和Object类型之间的转换。如:装箱时候值类型转变为Object类型,其实是值类型的一个副本而已,所以副本的改变不会影响原值!
        如果你要实现副本改变原值的情况,要使用引用类型!C#分为值类型和引用类型,引用类型可以做到这个效果!
      

  2.   

    同意楼上的ref
    楼主查下管理方法传递参数的类型 
    有值类型和引用类型之分值类型不改变原来的值
    引用类型执行方法之后原来的值要跟着改变
      

  3.   

    你的代码没有 拆箱装箱 过程 System.String 就是引用类型
    我希望当"aaa"改变为"bbb"时,新空间显示的值也会改变为"bbb"========传递参数是用 ref / out 关键字void RefParamSampleFoo(ref string str) {
         str += "hello";
    }
      

  4.   

    装箱拆箱是值类型与引用类型的转换.string是.net里面很特殊的一个类型,它是引用类型,但是同时又有值类型的特点.你的程序中并没有猜想装箱过程.
      

  5.   

    举例:object o = i; 
      此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。
      所以o并没有指向i的原值,而是指向了i的副本,所以对其进行操作无论如何改变都不能影响原值!如果要改变原值可以考虑用引用类型或者ref/out参数!
      

  6.   

    string s = "1"; //内存堆中的一块空间,地址1
    Object o = s;  //内存堆中一块新空间地址2,存放一个指针指向地址1
    Object o1 = o;  //内存中一块新空间地址3,存放一个指针,指向地址2
    o = "2";       //内存中一块新空间地址4,目前没有其他指针指向这个地址
    ===================================================================================
    所以,上面Object o = s;//内存堆中一块新空间地址2,存放一个指针指向地址1-----"因该是内存堆中一块新空间地址2,存放一个指针指向地址a(此地址为s的一个副本地址)",个人理解,大家讨论!
      

  7.   

    string s = "1"; //内存堆中的一块空间,地址1
    Object o = s;  //内存堆中一块新空间地址2,存放一个指针指向地址1
    Object o1 = o;  //内存中一块新空间地址3,存放一个指针,指向地址2
    o = "2";       //内存中一块新空间地址4,目前没有其他指针指向这个地址
    ================================================================================
    所以,"Object o = s;  //内存堆中一块新空间地址2,存放一个指针指向地址1"
    ------因该是//内存堆中一块新空间地址2,存放一个指针指向地a(此地址为string s="1"中s的一个副本地址),其他注释也同样解释!个人理解,大家讨论!
      

  8.   

    在内存堆中有一个字符串"aaa",然后在内存堆中开辟一个新空间,指向"aaa"这个空间,我希望当"aaa"改变为"bbb"时,新空间显示的值也会改变为"bbb",类似于指针,应该如何操作,
    --------------
    这个就是引用类型,或者用ref或out(相当于C++中的指针)