当我更改作为另一个变量的变量的值时,它也会更改原始变量

时间:2016-02-14 18:31:35

标签: c# class variables

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但仍然Var2Var1获取其初始值?

2 个答案:

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