根据我的理解,将结构体的变量分配给相同类型的另一个变量将生成一个副本。但如下图所示,这条规则似乎被打破了。您能解释一下为什么会发生这种情况吗?
using System;
namespace ReferenceInValue
{
class Inner
{
public int data;
public Inner(int data) { this.data = data; }
}
struct Outer
{
public Inner inner;
public Outer(int data) { this.inner = new Inner(data); }
}
class Program
{
static void Main(string[] args)
{
Outer p1 = new Outer(1);
Outer p2 = p1;
Console.WriteLine("p1:{0}, p2:{1}", p1.inner.data, p2.inner.data);
p1.inner.data = 2;
Console.WriteLine("p1:{0}, p2:{1}", p1.inner.data, p2.inner.data);
p2.inner.data = 3;
Console.WriteLine("p1:{0}, p2:{1}", p1.inner.data, p2.inner.data);
Console.ReadKey();
}
}
}
最佳答案
您在主题中回答了您的问题。
你的结构体包含一个引用,当复制该结构体时,它会被复制为一 block 内存,包括引用(而不是被引用的对象),就像引用是一个整数或另一个基元一样。
复制结构不会导致克隆。
事实上,在结构中放置引用是一个坏主意,应该避免。 一个异常(exception)是不可变的引用对象(例如字符串),它们可以“安全”地放置在结构中,因为它们无法修改,但是您仍然会失去内存中的局部性。
请记住,值类型在其定义范围内本地存储,引用类型始终存储在堆上,而引用则在其定义范围内本地存储。
关于c# - 将包含类实例的结构体的变量分配给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6487014/