C# 克隆对象不会';在C语言中不能正常工作#

C# 克隆对象不会';在C语言中不能正常工作#,c#,clone,C#,Clone,我在复制对象时遇到问题 我想复制object1,然后在不更改object1的情况下更改object2 //我在这里克隆lower.Rebar对象 upper.Rebar=lower.Rebar.Clone(); //当我更改upper.Rebar时,lower.Rebar也会更改。 upper.Rebar.Polyline.Points.RemoveAll(p=>p.Y

我在复制对象时遇到问题

我想复制object1,然后在不更改object1的情况下更改object2

//我在这里克隆lower.Rebar对象
upper.Rebar=lower.Rebar.Clone();
//当我更改upper.Rebar时,lower.Rebar也会更改。
upper.Rebar.Polyline.Points.RemoveAll(p=>p.Y
类的定义

public class ColumnElevationRebar
    {
        public ColumnElevationRebar Clone()
        {
            var obj = new ColumnElevationRebar();

            obj.CanBeContinued = CanBeContinued;
            obj.CanBeSpliced = CanBeContinued;
            obj.ConnectionType = ConnectionType;
            obj.SpliceLength = SpliceLength;
            obj.Polyline = Polyline;

            return obj;
        }

        private double splicelength;
        public double SpliceLength
        {
            get { return splicelength; }
            set { splicelength = Arithmetics.Ceiling(value, 100); }
        }

        public RebarConnectionType ConnectionType { get; set; }

        public bool CanBeSpliced;
        public bool CanBeContinued;

        public bool IsSelected;

        public Polyline Polyline { get; set; }

        public double Length
        {
            get { return Arithmetics.Ceiling(Polyline.Length, 100); }
        }
    }


public class Polyline
{
    public Polyline Clone()
    {
        var obj = new Polyline {Points = this.Points};
        return obj;
    }

    public Polyline()
    {
        Points = new List<_2DPoint>();
    }

    public List<_2DPoint> Points { get; set; }
}
公共类ColumnElevationRebar
{
公共列提升钢筋克隆()
{
var obj=新的ColumnElevation钢筋();
obj.CanBeContinued=CanBeContinued;
obj.CanBeSpliced=可以继续;
obj.ConnectionType=ConnectionType;
obj.接头长度=接头长度;
对象多段线=多段线;
返回obj;
}
专用双接头长度;
公共双接头长度
{
获取{返回长度;}
设置{拼接长度=算术上限(值,100);}
}
公共RebarConnectionType ConnectionType{get;set;}
公共图书馆可以使用;
公共场所可以继续;
公选学校;
公共多段线多段线{get;set;}
公共双倍长度
{
获取{return Arithmetics.天花(Polyline.Length,100);}
}
}
公共类多段线
{
公共多段线克隆()
{

var obj=新多段线{Points=this.Points}; 返回obj; } 公共多段线() { 点=新列表(); } 公共列表点{get;set;} }
似乎Polyline是一个类,而不是基本类型。如果是这样,也可以为多段线创建克隆方法并使用它。

您只是在制作对象的浅拷贝。如果需要深度复制,则应克隆所有非值类型的对象。根据名称,我假设只有
多段线
需要克隆:

public ColumnElevationRebar Clone()
{
    var obj = new ColumnElevationRebar();

    obj.CanBeContinued = CanBeContinued;
    obj.CanBeSpliced = CanBeContinued;
    obj.ConnectionType = ConnectionType;
    obj.SpliceLength = SpliceLength;
    obj.Polyline = Polyline.Clone();

    return obj;
}
只需在Polyline对象中定义Clone方法(我不知道该类)

编辑: 您在多段线类中犯了相同的错误,还需要克隆列表:

public Polyline Clone()
{
    var obj = new Polyline {Points = new List<_2DPoint>(this.Points)};
    return obj;
}
公共多段线克隆()
{

var obj=新多段线{Points=新列表(this.Points)}; 返回obj; }
您能添加
ColumnElevationRebar
类的定义吗?似乎
多段线
应该被克隆,而不仅仅是赋值。@FelipeOriani我添加了类的定义。您的意思是我还需要为多段线类定义一个克隆方法?我应该使用我使用过的相同克隆方法吗?不。您需要编写新方法。据我所知,多段线聚合了一个点数组(或列表),对吗?您需要在Polyline.Clone方法中创建数组的副本。还有一个问号,这是否也适用于枚举类型?否。枚举与其他基元类型(Int32,DateTime)一样,可以只复制,而不克隆。字符串是复杂类型,但也不需要克隆,因为它是只读的。数组、列表、堆栈和其他复杂类型必须克隆。var obj=new Polyline{Points=new List(this.Points)};这里将创建具有相同点的新列表。我现在创建了,但它不起作用。我在问题中添加了多段线类定义。谢谢。这真令人沮丧。
public Polyline Clone()
{
    var obj = new Polyline {Points = new List<_2DPoint>(this.Points)};
    return obj;
}