gpt4 book ai didi

c# - 为什么字符串表现得像 ValueType

转载 作者:太空狗 更新时间:2023-10-29 18:00:41 25 4
gpt4 key购买 nike

执行这段代码后我感到很困惑,其中字符串的行为似乎就像它们是值类型一样。我想知道赋值运算符是否正在对字符串的相等运算符等值进行操作。

这是我用来测试这种行为的一段代码。

using System;

namespace RefTypeDelimma
{
class Program
{
static void Main(string[] args)
{
string a1, a2;

a1 = "ABC";
a2 = a1; //This should assign a1 reference to a2
a2 = "XYZ"; //I expect this should change the a1 value to "XYZ"

Console.WriteLine("a1:" + a1 + ", a2:" + a2);//Outputs a1:ABC, a2:XYZ
//Expected: a1:XYZ, a2:XYZ (as string being a ref type)

Proc(a2); //Altering values of ref types inside a procedure
//should reflect in the variable thats being passed into

Console.WriteLine("a1: " + a1 + ", a2: " + a2); //Outputs a1:ABC, a2:XYZ
//Expected: a1:NEW_VAL, a2:NEW_VAL (as string being a ref type)
}

static void Proc(string Val)
{
Val = "NEW_VAL";
}
}
}

在上面的代码中,如果我使用自定义类而不是字符串,我会得到预期的行为。我怀疑这是否与字符串不变性有关?

欢迎专家对此发表意见。

最佳答案

您没有更改 a1 指向的对象的任何内容,而是更改 a1 指向的对象。

a = new Person(); b = a; b = new Person();
(来源:morethannothing.co.uk)

您的示例将“new Person { … }”替换为字符串文字,但原理是相同的。

当您更改对象的属性时,区别就来了。改变一个值类型的属性,并没有反射(reflect)在原来的。

a = new Person(); b = a; b.Name = …;
(来源:morethannothing.co.uk)

更改引用类型的属性,并反射(reflect)在原始类型中。

a = new Person(); b = a; b.Name = …;

附注抱歉图像的大小,它们只是来 self 躺在那里的东西。您可以在 http://dev.morethannothing.co.uk/valuevsreference/ 查看全套,其中涵盖了值类型、引用类型以及按值和按引用传递值类型,以及按值和按引用传递引用类型。

关于c# - 为什么字符串表现得像 ValueType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com