c#队列值意外更改
下面的代码更改放置在队列上的第一个对象的值。这是将第一个对象放入队列的代码:c#队列值意外更改,c#,linq,C#,Linq,下面的代码更改放置在队列上的第一个对象的值。这是将第一个对象放入队列的代码: //put the initial Ma value on the movingAverageQueue movingAverageQueue.Enqueue(previousMa) 这行代码更改了我已经放置在队列上的第一个对象 previousMa.Close = previousMa.Close - sub/period; 我在这段代码的逻辑中遗漏了什么 以下是完整的代码: public class MA {
//put the initial Ma value on the movingAverageQueue
movingAverageQueue.Enqueue(previousMa)
这行代码更改了我已经放置在队列上的第一个对象
previousMa.Close = previousMa.Close - sub/period;
我在这段代码的逻辑中遗漏了什么 以下是完整的代码:
public class MA
{
public static Queue<DateClose> MAMethod(Queue<DateClose> queue,
Queue<DateClose> firstMASample, int period)
{
Queue<DateClose> sample = new Queue<DateClose>(firstMASample.ToArray());
Queue<DateClose> movingAverageQueue = new Queue<DateClose>(queue.Count() + 1);
// get the last item or initial MA value from the queue
DateClose previousMa = firstMASample.LastOrDefault();
sample = new Queue<DateClose>(firstMASample.Take(firstMASample.Count - 1));
DateClose mA = null;
decimal sub = 0;
DateClose add = null;
//put the initial Ma value on the movingAverageQueue
movingAverageQueue.Enqueue(previousMa);
foreach (DateClose d in queue.ToList())
{
mA = sample.Dequeue();
sub = mA.Close;
previousMa.Close = previousMa.Close - sub/period;
add = d;
sample.Enqueue(d);
previousMa.Close = previousMa.Close + add.Close/period;
previousMa.Date = add.Date;
movingAverageQueue.Enqueue(previousMa);
queue.Dequeue();
}
return movingAverageQueue;
}
}
在C#中,对象引用是按值传递的,因此您要赋予该对象一个引用。队列中的引用仍然指向相同的内存位置,因此当您更改对象时,您将在退出该对象引用的队列时看到这些更改
“我在这段代码的逻辑中遗漏了什么?”你能告诉我们发生了什么/没有发生什么吗?您希望发生/不希望发生什么?您将
previousMa
分配到一个位置。它被指定为对firstMaSample
中最后一项的引用(如果有)。您正在一次又一次地将同一引用添加到movingAverageQueue
。您将得到一个队列,其中队列中的每个项目都是相同的项目。您是否可能需要发现值类型和引用类型之间的差异?或者你忘了在循环中再次分配previousMa
。我在这里发现了一个惊人的例子,对象引用是通过值传递的。。。也许这不是解释“通过引用传递”和“通过值传递”的最佳方式。我知道一开始听起来有点奇怪,但这与通过引用传递是不同的。我链接的那篇文章有一个方框,说明了这一点。
public class DateClose
{
public DateTime Date { get; set; }
public decimal Close { get; set; }
}