【问题标题】:C# Object Assignment [duplicate]C# 对象分配 [重复]
【发布时间】:2014-09-01 06:33:50
【问题描述】:

我正在用 C# 编写代码。请看下面的代码。

    //-- Constructor
    public frmInvoice(EditInvoice editInvoice)
    {
        InitializeComponent();

        originalInfo = new EditInvoice();
        editedInfo = new EditInvoice();

        originalInfo = editInvoice;
        editedInfo = editInvoice;
        payment = new Payment();
    }

    //-- Process
    private void btnOk_Click(object sender, EventArgs e)
    {
        editedInfo.AppliedAmount = Convert.ToDouble(txtAppliedAmount.Text);
        editedInfo.PaymentCode = cboPaymentCode.SelectedValue.ToString();
        editedInfo.Remarks = txtRemarks.Text;

        if (originalInfo.AppliedAmount != editedInfo.AppliedAmount ||
            originalInfo.PaymentCode != editedInfo.PaymentCode ||
            originalInfo.Remarks != editedInfo.Remarks)
        {
            editedInfo.IsEdited = true;
        }
    }

现在的问题是,为什么原来的对象**originalInfo** 也发生了变化,这应该是没有的。好烦!

附加:如果有差异,是否有更好/最短的方法来与对象(模型)进行比较?

【问题讨论】:

  • editInvoice 是引用类型吗?
  • 不,它不是引用类型
  • 大概是……不是上课吗?
  • 您在构造函数中同时指定originalInfoeditInfo 来引用同一个对象。显然,“改变其中一个”似乎会改变两者,因为它们都指的是同一个单一的对象。
  • @Lasse 但我将它分配给不同的变量。那么我怎样才能成功地做到这一点呢?

标签: c# object


【解决方案1】:

由于editInvoice 可能是一个引用类型,你应该克隆它而不是直接分配它。

http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone(v=vs.110).aspx

更新: 由于您声明 editInvoice 是一个模型,它是一个引用类型,任何类都是一个引用类型。例如,结构将是值类型。有关更多信息,请参阅本文:http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx

【讨论】:

  • “不,它不是引用类型”.. 虽然我持怀疑态度,但如果不看实现就很难说。
  • editInvoice 是一个模型。已经使用 MemberwiseClone 成功克隆了它。谢谢!
  • @Bryan 很高兴看到它有效,我更新了我的答案,所以你有更多信息。
猜你喜欢
  • 1970-01-01
  • 2020-02-21
  • 2012-09-05
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多