Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重用对象不能正常工作_C#_Asp.net 3.5_Code Reuse - Fatal编程技术网

C# 重用对象不能正常工作

C# 重用对象不能正常工作,c#,asp.net-3.5,code-reuse,C#,Asp.net 3.5,Code Reuse,我重用一个创建的对象只是为了更改日期和序号值,但最后我得到了6个与上一个完全相同的对象 换句话说,我添加对象作为引用,我应该添加作为值 我应该继承什么来拥有复制方法 谢谢您可以实现iClonable,然后调用clone获取对象的浅拷贝 如果需要,您可以这样实现。可能有更好的方法: public object Clone() { return MemberwiseClone(); } 你不会得到6个对象。最终得到6个引用,所有引用都引用同一个对象 您可以实现iClonable,并调用Ob

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

换句话说,我添加对象作为引用,我应该添加作为值

我应该继承什么来拥有复制方法


谢谢

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

如果需要,您可以这样实现。可能有更好的方法:

public object Clone()
{
    return MemberwiseClone();
}
你不会得到6个对象。最终得到6个引用,所有引用都引用同一个对象

您可以实现iClonable,并调用Object.MemberwiseClone——但我不确定我会这么做。相反,我会尝试从一开始就让RecurringPayment不可变,并添加一个带有NextPaymentDateTime 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);
}

顺便说一句,代码中的注释并没有说太多。添加对象的方法不需要注释。也许你会评论一下为什么要添加它,或者你为什么不选择克隆方法,有什么技术上的顾虑,或者只是为了提供一个新的见解?Ty.@balexandre:我发现不可变类型更容易理解和使用。iClonable通常被认为是一个糟糕的接口:您必须强制转换结果,因为它只返回object,并且没有关于它应该执行深度克隆还是浅层克隆的指示。我将遵循您的建议:这是最简单的一个:Ty!
// 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);
}