情况一:
Class Sample 
{
int x;
int y;
}
Sample sample1, sample2;
经过一些操作sample1有值了,然后写语句
sample2=sample1;
然后,问题:接下来操作改变sample2 里的x或者y的值,sample1会不会随着有同样的变化?情况二:
Class Sample 
{
int[] x;
int y;
}
Sample sample1, sample2;
经过一些操作sample1有值了,然后写语句
sample2=sample1;
然后,问题:接下来操作改变sample2 里的x或者y的值,sample1会不会随着有同样的变化?我的应用是第二种情况,我发现当我改变sample2里的y的值时,sample1中的y也随之变了。好像说sample2=sample1;只是传了个地址。(工程写了很大了,才发现这个严重的问题,悲催了。。)有人能帮我解读一下这个现象么?谢谢啦

解决方案 »

  1.   

    按照我的理解吧,你这样写,相当于把sample1, sample2的引用全部指向了sample1的内存区块,sample2在内存的实体现在已经不知道怎么样了,垃圾回收是非常有可能把sample2的实体清空了,所以不论你现在调用sample1还是sample2中的方法,实际操作的应该只是原来sample1的实体对象。这个应该是传值和传址的问题你弄错了,个人愚见,欢迎大家讨论指正。
      

  2.   

    如果是两个数组,我很清楚传值传址问题。现在是两个对象实例啊。
    如果我想sample2=sample1,但是希望保证赋值之后sample2和sample1仍是两个不相干的。如何操作?难得要把类里的各个定义依次copy一下?求助啊
      

  3.   

    引用类型和值类型对象的特性是入门级最最基础的问题,任何学.NET编程的都应该在前三课搞清这个概念...而你竟然会“工程写了很大了,才发现这个严重的问题”...如果你这所谓的“工程”只是毕业设计之类的作业,你还来得及补课,放下你所谓的“工程”认真去补习基础...如果你已经在工作,所谓的“工程”是商业项目,那只能是你们公司的悲哀...从你的主管到HR都应该检讨...ps:这其实不是.NET的问题,深拷贝和浅拷贝的概念也是最最基础的编程概念...
      

  4.   

    记住一点. class是引用类型的 struct是值类型
    引用类型传递,修改成员,原始对象发生变化,因为修改的就是原始地址的值.
    值类型传递,拷贝一个同样值的数据,修改拷贝对象,对原对象无影响.
      

  5.   

    其实你要改也不用改多少
    比如第一种情况:
    在类的构造函数中这样写
    public Sample(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
    然后你那句sample2=sample1  改为  sample2=new Sample(sample1.x,sample1.y);
      

  6.   

    你这样改也很简单在类的构造函数中这样写
    Public Sample(int x,int y)
    {
        this.x=x;
        this.y=y;
    }然后你那句赋值操作改为:sample2=new Sample(sample1.x,sample1.y);
      

  7.   

    楼上已经说的够明白了
    Class Sample  
    {
    int x;
    int y;
    public Sample()
    {
    }public Sample(Sample objectSam)
    {
     x=objectSam.x;
     y=objectSam.y;
    }
    public static Sample Coyp(Sample objectSam)
    {
      ........
     }}
    }
    main()
    {
    sample2=new Sample(sample1);
    sample2=Sample.copy(sample1);
    }
    你喜欢那种都行
      

  8.   

    当然改变了,sample1和sample2其实都是指针,都指向了这个对象,
    相不改变把class 改为struct就可以了

    Struct Sample  
    {
    int x;
    int y;
    }
      

  9.   

    class是引用类型...传值什么的传的是内存地址  所以才会有你的问题,所以在给sample2赋值时新建一块内存地址就ok了
    Sample sample1;
    Sample sample1 = new sample();
    sample1 = sample2;