Tre*_*ree 5 c# value-type reference-type
所以我今天发现结构和类在 C# 中用于分配变量时的行为不同..据我所知,当我将结构分配给变量时,变量存储该结构的副本,当我分配一个类时到一个变量,该变量存储对该类实例的引用。
在这种情况下,dad2 包含一个 dad1 的副本,所以我对 dad2 做的任何事情都不应该影响 dad1 吗?显然情况并非如此,因为当我将一个儿子添加到 dad2 时,它也会将同一个儿子添加到 dad1。
public struct Dad {
public string name;
public List <Son> sons;
public struct Son {
public string name;
public Son (string n) {
name = n;
}
}
}
static void Main (string [] args) {
Dad dad1 = new Dad ();
dad1.name = "Bob";
dad1.sons = new List <Dad.Son> {new Dad.Son ("A")};
Dad dad2 = dad1;
Debug.WriteLine (dad2.Equals (dad1) + " " + dad1.sons.Count () + " " + dad2.sons.Count ());
//true 1 1
dad2.sons.Add ( new Dad.Son ("B"));
Debug.WriteLine (dad2.Equals (dad1) + " " + dad1.sons.Count () + " " + dad2.sons.Count ());
//true 2 2
}
Run Code Online (Sandbox Code Playgroud)
是的,它复制了结构内部的值 - 并且在结构内部有一个对列表的引用,以便引用也被复制 - 这是一个“浅复制”......如果列表已被复制到一个新的对象这将是一个“深层复制”...结构赋值使用“复制”语义,这取决于每个成员的复制语义...请参阅http://msdn.microsoft.com/en-us/library/saxz13w4.aspx