【问题标题】:C# how to copy templet object data to a new object , but no the address [duplicate]C#如何将模板对象数据复制到新对象,但没有地址[重复]
【发布时间】:2013-12-02 03:56:06
【问题描述】:

我基本上想定义一个模板数据对象, 并使用这个模板数据对象来分配新的数据对象。 然后将不同的值赋给新的数据对象。

代码如下:

public class sData
{
    public  string name;
    public  int Number;
    public sData(string name,int Number)
    {
        this.poster_path = path;
        this.Number = Number;
    }
}

sData templet= new sData("aaaa","0");

sData realData1 = new sData();
realData1=templet;
realData1.Number=100;

但在realData1.Number=100;之后

我发现templet.Number 改为100

我怎样才能把100realData1,而不给templet

【问题讨论】:

    标签: c# oop object


    【解决方案1】:

    我是否正确地说您想设置一些工厂对象,该对象将创建具有预定义值集的数据对象(即模板)?

    您上面的代码不会这样做。您只创建了一个对象,但对它有两个不同的引用。

    也许这样的事情会满足你的需要:

    public class sData
    {
        public string name;
        public int Number;
        public sData(string name,int Number)
        {
            this.poster_path = path; //copied from question, this might need updating.
            this.Number = Number;
        }
    
        sData CreateCopy()
        {
            return new sData(name, number);
        }
    
    }
    
    
    sData template = new sData("aaaa","0");
    
    sData realData1 = template.CreateCopy();
    realData1.Number=100;
    

    这仍然感觉不是很优雅,也许工厂和数据对象的单独类会更合适,但如果没有更多上下文就很难说。

    【讨论】:

    • 我知道这样,但是大类是由 EF 生成的,不应该编辑。到目前为止,我只是将所有列复制到每个新对象....
    【解决方案2】:

    您将templet 的对象变量分配给realData1,这样您仍然在内存中引用同一个对象:

    realData1=templet;
    

    您可以分配值而不是对象本身:

    realData1.name = templet.name;
    realData1.Number = templet.Number;
    

    【讨论】:

      【解决方案3】:

      类是引用类型,类sDatarealData1templet的引用变量指向堆中相同的内存位置,所以templet 被值 realData1 覆盖。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 2016-09-09
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多