通过参考麻烦

时间:2013-12-13 19:10:02

标签: c# pass-by-reference

所以最近我发现你可以通过将变量传递给另一个类对象来更改变量,然后更改新接收的值将更改初始值。 我必须道歉,因为我知道我很难解释这一点。这是我的测试,看它是否有效,而且确实如此。

课程计划     {         静态对象A;         static objectB b;

    static void Main(string[] args)
    {
        a = new objectA();
        b = new objectB(a);

        Console.WriteLine(a.v + "\n");
        Console.WriteLine(b.b.v + "\n");

        a.v = 5;

        Console.WriteLine(a.v + "\n");
        Console.WriteLine(b.b.v + "\n");

        b.b.v = 7;

        Console.WriteLine(a.v + "\n");
        Console.WriteLine(b.b.v + "\n");

        Console.ReadLine();
    }
}

class objectB
{
    public objectB(objectA b)
    {
        this.b = b;
    }

    public objectA b;
}

class objectA
{
    public objectA()
    {
        v = 0;
    }

    public int v;
}

我在一个以粒子和粒子引擎为特色的项目中玩这个,它运作得非常好,但后来我尝试了别的东西而且我有点失落。

我有一个继承了B类的A类,它继承了抽象类C。

Main class初始化A类并向其传递一个值,该值存储在C类中。

与我的测试不同,当我在主类中编辑值时,该值在C类中不会改变。

class MainExample { 
private vector2 position = new vector2(175, 135);
private ship_ShipName ship_();
...
     public MainExample()
     {
          ship_ = new ship_ShipName(position);
          ...

      }
}

class ship_ShipName : Ship
{
     public ship_ShipName(vector2 position)
     {
          this.position = position; //this.position being the position from Module.cs
     }
}

class Ship : Module { ... }
abstract class Module { vector2 position; }

现在看着我的粒子引擎,我发现它不是抽象的,所以问题必须与之相关。我非常感激任何见解,我认为我所描述的是“通过引用传递?”感谢。

2 个答案:

答案 0 :(得分:6)

您发布的示例代码中的任何位置都没有传递引用。您正在构建两个不同的对象ab。这些对象是独立的,对一个属性/字段的更改不会反映在另一个对象中。

您可能认为此行正在创建引用:

b = new objectB(a);

不是。它正在创建一个新对象,调用objectB的构造函数将a作为参数传递(并通过值传递)。

基于OP澄清的编辑

我认为您的测试程序与您发布的实际代码之间的区别在于,在实际代码中,vector2struct。结构是C#中的值类型,与引用类型的类不同。在测试代​​码中,当您将a传递给b的构造函数时,参数是一个类,因此引用传递引用类型。在您的真实代码中,正在制作vector2的副本。

您可以添加ref关键字以通过引用将值传递给构造函数。但是,当您将其分配给本地字段时,仍会创建副本。没有简单的方法来解决这个问题。最好的方法是创建一个包含向量的class包装器类型,然后所有各方都持有对包装器对象的单个实例的引用。

答案 1 :(得分:-2)

通过引用传递类。它们是指向该类的指针。不复制类参数。因此,如果您更改参数类的“字段”,那么“外部类”字段将会更改。有一个类的实例。

克隆正在复制一个类(创建两个不同的类)。