我开始学习C#,并且可以对以下结果向我解释有关值类型和引用类型的问题。我的理解是,整数和结构是值类型,因此被复制到赋值和字符串中,并且类是引用类型,因此只有引用被复制,而不是基础对象。这是我的代码来测试这个:c#值类型和引用类型
struct MyStruct
{
public class C
{
public string _string;
};
public C _c;
public string _string;
public int _a;
public MyStruct(int a, string s)
{
_a = a;
_c = new C();
_c._string = s;
_string = s;
}
};
public static void Main(string[] args)
{
MyStruct stru = new MyStruct(4, "Hello");
MyStruct stru2 = stru;
stru2._a = 5;
stru2._string = "World";
stru2._c._string = "World";
Console.WriteLine("Stru _a: " + stru._a);
Console.WriteLine("Stru2 _a: " + stru2._a);
Console.WriteLine("Stru _string: " + stru._string);
Console.WriteLine("Stru2 _string: " + stru2._string);
Console.WriteLine("Stru C _string: " + stru._c._string);
Console.WriteLine("Stru2 C _string: " + stru2._c._string);
}
在这个人为的例子,我得到下面的输出:
Stru _a: 4
Stru2 _a: 5
Stru _string: Hello
Stru2 _string: World
Stru C _string: World
Stru2 C _string: World
int变量_a非常有意义。这是一个值类型,因此它被复制并且不被引用,因此对“Stru2”的更改不会影响“Stru”。 _string让我感到惊讶,因为它是一个引用类型,我期望这两个值都被输出为“World”。我希望_c._string既可以是“世界”,但我不明白为什么行为不同于_string而不是类的一部分。 任何解释将不胜感激。 谢谢!
*“的任意字符串变量,得到了相同的值指向同一共享发生在存储器” * - 虽然这有时是真实的,由于[字符串实习](https://stackoverflow.com/q/ 8054471/216074),这种行为不能保证或不被要求发生(情况往往不会如此)。 'stru._string'和'stru2._string'将指向相同的地方,因为*参考在复制结构时被复制。 – poke