public class TestClass
{
public int TestNumber;
public string TestName;
public TestClass(string name, int number)
{
TestName = name;
TestNumber = number;
}
}
public class AnotherClass
{
TestClass Var1, Var2;
void Start()
{
Var1 = new TestClass("Me", 1);
Var2 = Var1;
Var2.TestName = "aaa";
}
}
当我调试Var1.TestName
的值时,我得到"aaa"
,但最初是"Me"
。我如何分隔每个var但仍然Var2
从Var1
获取其初始值?
答案 0 :(得分:2)
这是你的问题:
Var1=new TestClass("Me",1);
Var2 = Var1;
Var2.TestName="aaa";
Var2 = Var1;
实际上是参考副本!这意味着Var2
将采用Var1
的地址,无论您在其中任何一个中修改了什么,它都会在另一个中可见。为此,我建议使用Var2
的副本。为此,请在testClass
班级中创建一个方法。
public testClass copy()
{
testClass tC = new testClass(this.TestNumber, this.TestName);
return tC;
}
现在您可以分配如下值:Var2 = Var1.copy();
答案 1 :(得分:0)
在处理对象时,C#是一种pass by reference语言。因此,当您说Var2 = Var
时,您说Var2
现在拥有Var1
所持有的任何地址的地址,从而有效地使它们指向同一个对象。
一种解决方法是将其转换为按值传递,如下所示:
public void Start()
{
Var1 = new TestClass("Me", 1);
Var2 = new TestClass(); // You would need a default constructor, and to use it to prevent the null exception error
Var2.TestNumber = Var1.TestNumber;
Var2.TestName = "aaa";
}
或者,如果您将使用更多值,这是一个过于简化的示例,您可以使用另一种方法:
public void Start()
{
Var1 = new TestClass("Me", 1);
Var2 = Var1.GetValues();
}
在你的测试班中:
public testClass GetValues() => return new testClass(TestNumber, TestName);