在一个类中,我有一堆类变量,它们保留游戏块的位置。移动之后,我需要遍历这些变量并更改每个变量。 我遇到的问题是,只需创建一个列表并添加这些变量,它们的值就会传递到列表中,并且更改列表元素不会更改变量。
int _var1;
int _var2;
int _var3;
List<int> varList = new List<int>() { _var1, _var2, _var3 };
for (int i = 0; i < varList.Count; i++)
{
varList[i]++;
}
类似的事情不起作用。
我觉得这里缺少一些非常简单的oop概念,但我想不出如何遍历所有这些变量,而不必做比仅仅一种方法所需的复杂的事情。
答案 0 :(得分:0)
Value types添加到列表时,它们会被复制。列表分配不同的内存。
即使最好不要有副作用,函数也应该返回值Tuple,然后您明确地设置它们。
如果要通过引用传递它们,则需要将其包装在object中:
public class ValueStorage
{
public int Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
var _var1 = new ValueStorage() { Value = 0 };
var _var2 = new ValueStorage() { Value = 1 };
var _var3 = new ValueStorage() { Value = 2 };
var varList = new List<ValueStorage> { _var1, _var2, _var3 };
for (int i = 0; i < varList.Count; i++)
{
varList[i].Value++;
}
}
}
答案 1 :(得分:0)
您可以创建一个类,并将您的Var1,Var2和Var3放入其中,并进行初始化和对象并在循环中调用它们。
类似这样的东西。
List<MyClass> obj_list = get_the_list();
foreach( MyClass obj in obj_list ){ obj.property = 42;}
答案 2 :(得分:0)
这就是值类型的工作方式。拳击也无济于事
根据规范 1.3类型和变量
将值类型的值转换为对象类型时,对象 实例(也称为“框”)被分配为保存值,并且 值将复制到该框中。相反,当一个对象引用是 强制转换为值类型,然后检查所引用的对象是否为 正确值类型的框,如果检查成功,则该值 框中的内容被复制出来。
int*
)。 (这是假设数组是合适的),这将允许功能转换而无需将它们封装在另一种类型中示例
private int _var1 = 1;
private int _var2 = 2;
private int _var3 = 3;
...
var varList = new[] { &_var1, &_var2, &_var3 };
...
foreach (var value in varList)
*value += 1;
Console.WriteLine(_var1);
Console.WriteLine(_var2);
Console.WriteLine(_var3);
输出
2
3
4
其他资源