回 帖 发 新 帖 刷新版面

主题:引用类型的问题

class A
{public int n;};

A x=new A;
A y;
y=x;

这个时候y和x都指向同一个引用,如果再添加下面两个语句:
y.n=3;
Console.WriteLine(x.n); //注意:括号里是x.n不是y.n
此时输出结果是3而不是0;

对于此例,在C++中y=x;语句只是简单的值复制(浅拷贝),x和y是不同的对象,都有为自己分配的存储空间.
但是C#中x和y指向同一个对象的引用的事实此时不是我想要的.我想在y=x;这个语句执行完后有C++那种浅拷贝的效果,我不想重载=然后在它里面用new开辟空间,把成员值一个一个复制到这个新对象上,最后再返回这个对象.请问我应该怎么做?(刚接触C#,可能C#里面有非常简单的方法实现这个作用,不过我不知道)

回复列表 (共5个回复)

沙发

估计你的类需要实现Clone()方法,然后用
y=x.Clone();
的方法实现对象的复制

板凳

改为:
A x=new A();
A y=new A();
y=x;

3 楼

2楼的做法得到的结果是一lz的是一样的。x,y是代表同一个引用。
我也认为楼主想要浅拷贝一个引用类型还是需要自己实现特定方法或重载符号

4 楼

.....我错了.....
被string误导了..
namespace ConsoleApplication6
{
    class A:ICloneable
    {
        public int n;
        #region ICloneable Members

        public object Clone()
        {
            // TODO:  Add A.Clone implementation
            A temp = new A();
            temp.n = this.n;
            return temp;
        }

        #endregion
    };

    

    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            A x = new A();
            x.n=100;

            A y = new A();
            y=(A)x.Clone();;

            Console.WriteLine(x.n);
            Console.WriteLine(y.n);

            y.n=200;
            Console.WriteLine(x.n);
            Console.WriteLine(y.n);
        }
    }
}

5 楼

请问Clone()是哪个类里的方法?Clone()和MemberwiseClone()这两个方法有什么区别?能详细讲讲他们的用法吗?

我来回复

您尚未登录,请登录后再回复。点此登录或注册