关于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都将显示新值。


以上是关于c#和类或函数外的字符串与类或函数内的字符串的问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>