如何通过引用c#

时间:2018-11-23 06:13:59

标签: c# list oop reference

在一个类中,我有一堆类变量,它们保留游戏块的位置。移动之后,我需要遍历这些变量并更改每个变量。 我遇到的问题是,只需创建一个列表并添加这些变量,它们的值就会传递到列表中,并且更改列表元素不会更改变量。

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概念,但我想不出如何遍历所有这些变量,而不必做比仅仅一种方法所需的复杂的事情。

3 个答案:

答案 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

其他资源