所以最近我发现你可以通过将变量传递给另一个类对象来更改变量,然后更改新接收的值将更改初始值。 我必须道歉,因为我知道我很难解释这一点。这是我的测试,看它是否有效,而且确实如此。
课程计划 { 静态对象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; }
现在看着我的粒子引擎,我发现它不是抽象的,所以问题必须与之相关。我非常感激任何见解,我认为我所描述的是“通过引用传递?”感谢。
答案 0 :(得分:6)
您发布的示例代码中的任何位置都没有传递引用。您正在构建两个不同的对象a
和b
。这些对象是独立的,对一个属性/字段的更改不会反映在另一个对象中。
您可能认为此行正在创建引用:
b = new objectB(a);
不是。它正在创建一个新对象,调用objectB
的构造函数将a
作为参数传递(并通过值传递)。
基于OP澄清的编辑
我认为您的测试程序与您发布的实际代码之间的区别在于,在实际代码中,vector2
是struct
。结构是C#中的值类型,与引用类型的类不同。在测试代码中,当您将a
传递给b
的构造函数时,参数是一个类,因此引用传递引用类型。在您的真实代码中,正在制作vector2
的副本。
您可以添加ref
关键字以通过引用将值传递给构造函数。但是,当您将其分配给本地字段时,仍会创建副本。没有简单的方法来解决这个问题。最好的方法是创建一个包含向量的class
包装器类型,然后所有各方都持有对包装器对象的单个实例的引用。
答案 1 :(得分:-2)
通过引用传递类。它们是指向该类的指针。不复制类参数。因此,如果您更改参数类的“字段”,那么“外部类”字段将会更改。有一个类的实例。
克隆正在复制一个类(创建两个不同的类)。