【发布时间】:2015-12-20 20:47:52
【问题描述】:
如何检索变量的先前值? 考虑到这一点:
Int x = 0;
x = 5;
x = 10;
如何检索 x 的两个旧值?
【问题讨论】:
-
你不能。如果您需要记住它们,则需要在更改
x的值之前将它们存储在某个位置。
标签: c#
如何检索变量的先前值? 考虑到这一点:
Int x = 0;
x = 5;
x = 10;
如何检索 x 的两个旧值?
【问题讨论】:
x 的值之前将它们存储在某个位置。
标签: c#
如何检索变量的先前值?
您可能需要 Stack。堆栈是您只能从一侧添加(推送)和删除(弹出)项目的结构。
Stack<int> x = new Stack<int>();
x.Push(0); // push first value
x.Push(5); // second value after first value
x.Push(10); //...
现在你有 10 个在堆栈的顶部。你可以向后移动。
var value = x.Pop(); // 10
var pre = x.Pop(); // 5
var prePre = x.Pop();// 0
请注意,如果堆栈为空,Pop 将抛出异常。也可以使用 Peek 从堆栈顶部获取项目而不删除它。
var value = x.Peek(); // 10
var value2 = x.Peek();// still 10
请注意,Stack 在内部使用数组。
【讨论】:
我会把它们放在一个列表中。
var values = new List<int>();
int x = 0;
values.Add(x);
x=5;
values.Add(x);
x=10;
values.Add(x);
【讨论】:
很简单。
List<int> iList = new List<int>();
iList.Add(10);
iList.Add(20);
...
然后你可以简单地得到它:
iList.ElementAt(0);
iList.ElementAt(1);
或
iList.Last();
iList.First();
甚至:
iList.Where(x => x > 5).First();
【讨论】:
您需要将它们定义为单独的变量。 int var1、int var2 等...
【讨论】:
一旦值被重新分配,您将无法跟踪变量。您将不得不创建更多变量。像这样的:
var x = 0;
var x1 = 5;
var x2 = 10;
根据您的逻辑,分配或获取您需要的值。
【讨论】:
它是局部变量和字段的一般属性之一。值类型和引用类型没有区别。您的变量包含它们的值(或指向堆上值的指针)。
当您使用赋值运算符“=”时,您实际上是在替换变量上的值。对于value types,您无法获取先前的变量,因为每个赋值都会创建新变量。对于reference types 赋值,只需替换指向该值的指针,然后如果您保存指向它们的指针,则可以检索您的旧值。
boxing and unboxing 有特殊情况。
您的问题的答案很简单:您可以在新分配之前保存以前的值。上面的答案用新变量实现了最简单的方法:
var x = 0;
var x1 = 5;
var x2 = 10;
如果您不知道代码中有多少分配,您可以实现最简单的历史记录集合。
List<int> xHistoy = new List<int>(); // Or Queue<int>
int x;
private int AssignWithHistory(int val)
{
xHistory.Add(val);
return x;
}
x = AssignWithHistory(0);
x = AssignWithHistory(5);
x = AssignWithHistory(10);
但我认为主要目标不是实现您的场景,而是了解变量的原理及其在内存中的存储。
【讨论】:
您可以执行以下操作:
private int _x;
private int X
{
get { return _x; }
set
{
_x = value;
if (XHistory == null)
{
XHistory = new List<int> {_x};
}
else
{
XHistory.Insert(0, _x);
}
}
}
private List<int> XHistory { get; set; }
private void ShowHistoryOfX() => XHistory?.ForEach(Console.WriteLine);
每次您为 X 赋值时,它都会添加到历史列表中,然后您可以将其打印出来。最近的更改将插入到列表的开头。
【讨论】: