为什么基类中的列表成员会被更改?

时间:2014-05-30 19:12:49

标签: c# list generics constructor

这是一个简化的例子来说明我的问题。我将在此代码之后解释。

class Payment
{
    private double amount = 1;
    private DateTime date = new DateTime(2000, 01, 01);
    public Payment() {}
    public double Amount { get { return amount; } 
        set { this.amount = value; } }
    public DateTime Date { get { return date; } }
}

class PaymentStream
{
    public List<Payment> paymentStream = new List<Payment>();
    public PaymentStream()
    {
        for (int i = 0; i < 1; i++)
            paymentStream.Add(new Payment());
    }
    public Payment getIndividualPayment(int index) 
    { return paymentStream[index]; }

    public void displayStream()
    {
        string displayDetails = "Amount {0:c}   Date{1,10:d} ";
        foreach (Payment i in paymentStream)
        {
            Console.WriteLine(displayDetails, i.Amount, i.Date);
        }
    }
}
class DoubledPaymentStream : PaymentStream
{
    public List<Payment> doubledPaymentStream = new List<Payment>();
    public DoubledPaymentStream () : base()
    {
        for (int i = 0; i < 1; i++)
        {
            doubledPaymentStream.Add(getIndividualPayment(i));
            doubledPaymentStream[i].Amount = 
                doubledPaymentStream[i].Amount * 2;
        }
    }
    public Payment getIndividualDoubledPayment(int index)
    { return doubledPaymentStream[index]; }
}
class Program
{
    static void Main(string[] args)
    {
        DoubledPaymentStream doubledstream = new DoubledPaymentStream();
        Console.WriteLine(doubledstream.paymentStream[0].Amount);
        Console.WriteLine(doubledstream.doubledPaymentStream[0].Amount);
    }
}

所以它很基本。我创造了:

  • 持有双倍和日期时间的付款类别。
  • 包含付款列表的班级PaymentStream。
  • 继承自PaymentStream的类DoubledPaymentStream。

在我的脑海中,当我创建一个DoublePaymentStream对象时,我将有两个列表:paymentStream和doubledPaymentStream。每个列表应该独立于另一个列表。 doubledPaymentStream的数量应该是paymentStream值的两倍。

虽然payStream中的值在不应该加倍时发生了什么。因此paymentStream中的值与doubledPaymentStream相同。

我认为它可能与DoubledPaymentStreams构造函数有关,该构造函数调用PaymentStream中的方法并以某种方式重新分配。

你能否解释一下我做错了什么以及我需要改变什么才能解决这个问题?

谢谢!

3 个答案:

答案 0 :(得分:3)

那是因为当你这样做时:

doubledPaymentStream.Add(getIndividualPayment(i));

您实际上是将原始付款对象添加到其他列表中。两个列表现在都引用了同一个对象,当您修改它时,它会在两个列表中都发生变化。

您需要创建单独的付款对象以放入新列表,或者将付款设为value type

答案 1 :(得分:1)

我不必向你解释潜在的问题,如果你读到Value Types and Reference Types,你就会知道你基本上修改了相同的引用,因此两个列表都会更新。

所以,现在我们知道问题是什么了。怎么解决?只需将课程设为struct或将实例副本添加到doubledPaymentStream即可。这应该可以解决你的问题。

答案 2 :(得分:0)

你可以使用同一类istance,类intance作为c#

中的引用传递

所以如果你举个例子

Payment p = new Payment();
p.amount = 10;
paymentStream.add(p);

然后

p.amount = 2*p.amount;
doubledPaymentStream.add(p); 

这两个列表将包含与ammount 20相同的付款。

相关问题