意外对象引用



我在做一个项目时,有些事情没有像我预期的那样奏效,现在我正在重新评估我的整个存在。采用以下类别和方法:

public class Test{
public string Name { get; set; }
public int Value { get; set; }
}
public Test ReturnExample(Test test)
{
Test example = test;
example.Name = "abc";
return example;
}

现在,如果我有FirstValueSecondValue:

Test FirstValue = new Test {Name = "First", Value = 8 };
Test SecondValue = new Test {Name = "Second", Value = 12 };

到目前为止,所有这些似乎都很普通和简单,但让我惊讶的是,当你这样做时:

SecondValue = ReturnExample(FirstValue);

我所期望的价值观是:

FirstValue:
Name = "First"
Value = 8
SecondValue:
Name = "abc"
Value = 8

然而,我得到的是:

FirstValue:
Name = "abc"
Value = 8
SecondValue:
Name = "abc"
Value = 8

那么,这里发生了什么,我可以改变什么来得到我想要的?

基于此:

引用类型由包含引用的引用使用(地址(到对象,而不是对象本身。因为引用类型表示变量的地址,而不是数据本身,将引用变量分配给另一个变量不会复制数据相反,它会创建引用的第二个副本,该副本引用到与原始值相同的堆位置。引用类型变量存储在称为堆的不同内存区域中。这意味着当不再使用引用类型变量时可以标记为垃圾收集。

话虽如此,如果你想让你的代码按预期工作,你需要做一个深度复制:

public Test ReturnExample(Test test)
{
Test example = new Test();
example.Name = "abc";
example.Value = test.Value;
return example;
}

最新更新