关于c#和类或函数外的字符串与类或函数内的字符串的问题
c#
我知道字符串是一种引用类型,但我在理解为什么“refTest”类或函数之外的字符串不会像“refTest”类中的字符串那样表现时遇到问题。我的意思是,如果我有 2 个名为“name”和“name2”的字符串,并且两者都具有相同的值,因为 name2 具有 name 的副本,它将输出相同的值“A”,但随后我将第二个字符串值更改为“ B”,这次 name 和 name2 具有不同的值“A”和“B”,然后当我对来自“refTest”类的字符串执行相同操作时,它将输出 name1 和 name2 相同的值。不是都是字符串引用类型吗?这意味着它们在堆上有一个指针。对?我对为什么“refTest”类之外的字符串感到困惑
或者是每次我在“refTest”类之外声明一个字符串时,它都会存储在不同的地址(堆地址)上?
class Program
{
static void Main(string[] args)
{
string name = "A";
string name2 = name;
Console.WriteLine(name2 + " " + name);
// >> A A
name2 = "B";
Console.WriteLine(name2 + " " + name);
// >> A B
refTest test = new refTest();
test.rTName = "A";
Console.WriteLine(test.rName);
// >> A
refTest test2 = test;
test2.rName = "B";
Console.WriteLine($"test.rName = {test.rName}, test2.rName = {test2.rName}");
// >> test.rName = B, test2.rName = B
Console.ReadLine();
}
}
class refTest
{
public string rName;
}
回答
string,虽然是引用类型,但它是不可变的。这意味着当你 name2 = "B"创建一个新实例并name2指向新实例时,同时name仍然指向旧实例。
现在对于您的自定义类,当您这样做时,refTest test2 = test;您将test2指向与 相同的对象test,并且当您修改其中一个属性或字段时,因为它们都指向同一个对象,test并且test2都将显示新值。