引用C#中的另一个字符串

本文关键字:另一个 字符串 引用 | 更新日期: 2023-09-27 18:29:52

据我所知,C#中的字符串是一种引用类型。

因此,在下面的代码中,"a"应该等于"Hi",但它仍然保持其值,即"Hello"。为什么?

string a = "Hello";
string b = a;
b = "Hi";

引用C#中的另一个字符串

许多答案指出字符串是不可变的;虽然这是真的,但这与你的问题完全无关。

更相关的是,您误解了引用如何与变量相关。引用不是对变量的引用。把引用想象成一根绳子。你从这个开始:

a----------------------Hello

然后你说"b=a",这意味着将另一段字符串附加到a所附加的东西上

a----------------------Hello
                      /
b---------------------

然后你说"现在把b连接到嗨"

a----------------------Hello
b----------------------Hi

你认为参考文献是这样工作的:

a----------------------Hello

然后我说ba的另一个名称:

a/b ----------------------Hello

然后我更改b,也就是更改a,因为它们是同一事物的两个名称:

a/b ----------------------Hi

或者你可能认为参考文献是这样工作的:

a----------------------Hello

那么我说b指的是a:

b -------------- a ----------------------Hello

然后我改变b,这间接地改变了a:

b -------------- a ----------------------Hi

也就是说,您希望引用变量,而不是。你可以在C#中这样做,比如:

void M(ref int x)
{
    x = 1;
}
...
int y = 0;
M(ref y);

这意味着"在对M的调用期间,x是y的另一个名称"。x的变化会改变y,因为它们是同一个变量。请注意,变量的类型不需要是引用类型。

b = "Hi";更改b引用的字符串。CCD_ 12仍然引用CCD_。

string a = "Hello";  // Set a to reference the string "Hello"
string b = a;        // Set b to reference the same string as a
b = "Hi";            // Set b to reference the string "Hi"

您正在更改引用b。而不是a。引用本身被复制,而对象保持不变。因此,b="Hi"将对"Hi"对象的引用复制到b中。这不会影响a。

引用类型的概念在OOP程序员中是最令人困惑的。

运行下面的代码,你会惊讶地看到答案:

创建一个具有Name属性的简单Book类,并在应用程序的Main方法中编写以下代码。

Book a = new Book() {Name = "book a"};
Book b = new Book() {Name = "book b"};
Book c = a; //line 3
Book a = b; //Line 4
Console.WriteLine(c.Name);

毫无疑问,由于第4行,你会期望答案是"b本书"。您认为,当ca时,之后a变成了b,这也将使c等于b

事实并非如此

阅读Ballon类比中的气球anology作为参考类型。

NO!

您所做的是创建对字符串"Hello"的两个引用('a','b')。使用b = "Hi",您可以更改"b"以引用字符串"嗨"。

"a"永远不会以这种方式改变。