关于类或函数外的c#和字符串与类或函数内的字符串的问题

关于类或函数外的c#和字符串与类或函数内的字符串的问题,c#,C#,我知道string是一种引用类型,但我很难理解为什么“refTest”类或函数外的字符串的行为与“refTest”类内的字符串不同。我的意思是,如果我有两个名为“name”和“name2”的字符串,由于name2有name的副本,它们都有相同的值,它将输出相同的值“a”,但随后我将第二个字符串值更改为“B”,这次name和name2的值“a”和“B”不同,然后当我对来自类“refTest”的字符串执行相同操作时它将输出name1和name2相同的值。这两个字符串不是都是引用类型吗?这意味着它们在

我知道string是一种引用类型,但我很难理解为什么“refTest”类或函数外的字符串的行为与“refTest”类内的字符串不同。我的意思是,如果我有两个名为“name”和“name2”的字符串,由于name2有name的副本,它们都有相同的值,它将输出相同的值“a”,但随后我将第二个字符串值更改为“B”,这次name和name2的值“a”和“B”不同,然后当我对来自类“refTest”的字符串执行相同操作时它将输出name1和name2相同的值。这两个字符串不是都是引用类型吗?这意味着它们在堆上有一个指针。正当 我不明白为什么类“refTest”外的字符串输出的结果与类“refTest”内的不同

或者每次我在“refTest”类之外声明字符串时,它都会存储在不同的地址(堆地址)上


string
,虽然是引用类型,但它是不可变的。这意味着当您执行
name2=“B”
操作时,您正在创建一个新实例,并使
name2
指向新实例,而
name
仍然指向旧实例


现在,对于您的自定义类,当您执行
reftesttest2=test
您正在使
test2
指向与
test
相同的对象,并且当您修改其中一个属性或字段时,因为它们都指向相同的对象,所以
test
test2
都将显示新值。

字符串
,虽然是引用类型,但它是不可变的。这意味着当您执行
name2=“B”
操作时,您正在创建一个新实例,并使
name2
指向新实例,而
name
仍然指向旧实例


现在,对于您的自定义类,当您执行
reftesttest2=test
您正在使
test2
指向与
test
相同的对象,并且当您修改其中一个属性或字段时,由于它们都指向相同的对象,因此
test
test2
都将显示新值。

以下是代码运行时内存中发生的情况(仅限赋值)。这并不是说字符串是不可变的,而是指什么指向什么:

使一个变量等于另一个变量永远不会建立一个链

string x = "hello";

string y = x;
y
x
都指向“hello”。不是“y指向x,然后x指向hello,如果您更改x指向的内容,y将看到它”

是:y-->你好x-->你好

但当某个变量指向某个类,而该类有一个指向其他对象的变量时,确实有一个链。这就是你的refTest测试结果;您的
test
test2
指向reftest的一个实例,该实例指向一个名称a,然后您将该名称调出。。这建立了一个引用链,其中交换链的某些部分意味着上游的某个东西看到了它

以下是代码运行时内存中发生的情况(仅限赋值)。这并不是说字符串是不可变的,而是指什么指向什么:

使一个变量等于另一个变量永远不会建立一个链

string x = "hello";

string y = x;
y
x
都指向“hello”。不是“y指向x,然后x指向hello,如果您更改x指向的内容,y将看到它”

是:y-->你好x-->你好

但当某个变量指向某个类,而该类有一个指向其他对象的变量时,确实有一个链。这就是你的refTest测试结果;您的
test
test2
指向reftest的一个实例,该实例指向一个名称a,然后您将该名称调出。。这建立了一个引用链,其中交换链的某些部分意味着上游的某个东西认为它与test2是同一件事;你期望有什么不同?(顺便说一句,我认为是
test.rTName
是一个打字错误?)C#中的字符串与Java中的字符串或C中的字符数组有很大不同。Magnetron的回答解释了C#中的字符串是如何工作的。
test
test2
是同一回事;你期望有什么不同?(顺便说一句,我认为它
test.rTName
是一个打字错误?)C#中的字符串与Java中的字符串或C中的字符数组有很大不同。Magnetron的回答解释了C#中的字符串是如何工作的。现在已经很清楚了。谢谢所以每次我在Main函数中声明string,就意味着我正在“创建”一个新地址(堆)?我知道这个堆。创建新实例的不是声明,而是赋值@twinspectre<代码>系统。字符串是一种引用类型。它将是
null
,大小为0字节,直到它被分配到(或实例化)。因此,如果我有一个名为Characters的字符串(我知道单个字符有char)并且我分配=“a”,我使用相同的变量并分配“B”,这是否意味着a将“存储”在其原始地址上,而B(与以前相同的变量)将“存储”在不同的地址上?我不知道这些链接是否会持续,但这里是一堆未实例化字符串的屏幕截图。注意args是一个字符串数组。几步之后,它被实例化了。我要说的是,尽管我确实希望在堆上创建
stringname2=name
作为一个新实例(尽管在我的ss中是
testString2=testString1
),但事实并非如此。。至少不在主体范围内。不过,可能在编码器的范围内,因为这些快照的比较确实代表了大小的增加。现在很清楚了。谢谢所以每次我在Main函数中声明string,就意味着我正在“创建”一个新地址(堆)?我知道那堆东西,它不是
YES:   y --> hello <-- x
NO:    y --> x --> hello