【问题标题】:Reusing Object does not work properly重用对象无法正常工作
【发布时间】:2010-03-22 22:12:05
【问题描述】:

我重用创建的对象只是为了更改日期和序数值,但最后我得到了 6 个与最后一个对象完全相同的对象。

换句话说,我将对象添加为Reference,我应该添加为Value

我应该继承我的什么对象才能拥有Copy() 方法?

RecurringPayment rp, copy;

rp = new RecurringPayment
{
    ...
}
payments.Add(rp);  // add first object

copy = rp;  // Copy the original element
for (int i = 1; i <= 5; i++)
{
    copy.NextPaymentDate = copy.NextPaymentDate.AddDays(copy.RecurringTime * 7);
    copy.OrderOrdinal = copy.OrderOrdinal + 1;

    payments.Add(copy); // add 5 more with X weeks ahead
}

谢谢

【问题讨论】:

  • 顺便说一句,您的代码中的 cmets 并没有说太多。 “添加”方法添加对象不是您需要评论的。也许评论你为什么添加它等

标签: c# asp.net-3.5 code-reuse


【解决方案1】:

您可以实现 ICloneable,然后调用 clone 来获取对象的浅拷贝!

如果你愿意,你可以这样实现(可能有更好的方法):

public object Clone()
{
    return MemberwiseClone();
}

【讨论】:

  • 这是最简单的一个 :) Ty!
【解决方案2】:

你最终不会得到 6 个对象。您最终会得到 6 个引用,所有这些引用都指向同一个对象

可以实现ICloneable,并调用Object.MemberwiseClone - 但我不确定我是否会这样做。相反,我很想尝试让 RecurringPayment 不可变,然后添加一个方法 WithNextPaymentDate(DateTime nextDate) 或类似的东西,它会创建一个具有给定值的新对象。您的代码将是这样的:

// Can't use object initializers on immutable types of course - all the
// values would have to be specified in the constructor call
RecurringPayment payment = new RecurringPayment(...);
payments.Add(payment);

for (int i = 1; i <= 5; i++)
{
    // This would automatically increment the OrderOrdinal in the newly
    // created object
    payment = payment.WithNextPaymentDate(payment.RecurringTime * 7);
    payments.Add(payment);
}

【讨论】:

  • 想知道您为什么不选择 Clone() 方法,有任何技术问题或只是为了提供新的见解?泰。
  • @balexandre:我发现不可变类型更容易理解和使用。 ICloneable 通常被认为是一个糟糕的接口:你必须转换结果,因为它只返回 object,并且没有迹象表明它应该执行深层克隆还是浅层克隆。
  • 我会听从你的建议:)
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2012-12-09
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多