如果string是引用类型,比如 and class,那么为什么 ystr1和有str2不同的值呢?理论上,两个变量都应该引用堆上的同一个内存区域,country1以及country2
static void Main(string[] args)
{
Country country1 = new Country();
country1.x = 1;
country1.y = 2;
Console.WriteLine("Country1 {0}, {1}", country1.x, country1.y);
Country country2 = new Country();
country2 = country1;
country1.x = 3;
Console.WriteLine("Country1 {0}, {1}", country1.x, country1.y);
Console.WriteLine("Country2 {0}, {1}", country2.x, country2.y);
///////////////////
string str1;
str1 = "123";
Console.WriteLine("Str1 {0}", str1);
string str2;
str2 = str1;
str1 = "1234";
Console.WriteLine("Str1 {0}", str1);
Console.WriteLine("Str2 {0}", str2);
}

对于值类型的变量,值存储在变量本身中。对于引用类型的变量,该变量存储了对某个内存区域的引用,该区域又存储了一个值。现在关于 type
string,这种类型的变量存储一个引用,但细微差别是这个引用指向的分配内存是不可变的,所以每次对字符串执行任何操作时,实际上都是在内存中创建一个新对象. 而这样的操作只会直接影响已经发生变化的变量。让我们看看你的例子。是的,一个小小的补充。如果你这样做:
所有三个变量都将引用相同的内存区域,但是任何更改都不会影响其他两个变量,而只会创建另一行。
您可以阅读更多内容,例如:
看,String 确实是一个引用类型,但它的行为有点特定于 CLR,就像一个值类型。由于字符串传统上指的是“基本”类型,例如 int、double、Array,因此程序员下意识地期望字符串不是作为引用类型,而是作为值类型。为了确保这种行为,每次将新文字分配给字符串类型的变量都会创建一个新对象,并将对该新对象的引用返回给该变量。
因此这条线
可以理解为这样的伪代码
更新
如果值“Value”的字符串类型对象已经存在,CLR 将尝试不创建新对象,而是返回对现有对象的引用。总而言之,字符串是一种引用类型,它的值不是作为对象传递,而是作为对对象的引用。
您好,我将尝试用更易于理解的语言进行解释。假设您创建了 4 个字符串变量,然后执行以下操作
现在你有 s1 指向写入字符串 s3 的内存部分,还要注意 s3 不指向 s1 引用,即指向内存位置,也就是说,如果我们改变 s1 或 s3 的值,另一个值不会改变。还有 s2,s4。我认为这是合理且易于理解的解释,祝你好运。现在既然你知道这一切,试着在不写代码和编译的情况下思考和说出如果你这样做会发生什么
s1,s2,s3,s4 的值是多少?