据我所知,C# 中的字符串是引用类型。
所以在下面的代码中'a'应该等于“Hi”,但它仍然保持它的值“Hello”。为什么?
string a = "Hello";
string b = a;
b = "Hi";
据我所知,C# 中的字符串是引用类型。
所以在下面的代码中'a'应该等于“Hi”,但它仍然保持它的值“Hello”。为什么?
string a = "Hello";
string b = a;
b = "Hi";
许多答案指出字符串是不可变的。虽然这是真的,但这与你的问题完全无关。
更相关的是,您误解了引用如何与变量相关。引用不是对变量的引用。将引用视为一段字符串。你从这个开始:
a----------------------Hello
然后你说“b = a”,这意味着将另一段字符串附加到附加到的同一事物a
上:
a----------------------Hello
/
b---------------------
然后你说“现在将 b 附加到 Hi”
a----------------------Hello
b----------------------Hi
您认为引用的工作方式如下:
a----------------------Hello
然后我说这b
是另一个名称a
:
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
引用。 a
仍然参考"Hello"
。
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。不是一个。引用本身被复制,而对象保持不变。所以 b = "Hi" 将对 "Hi" 对象的引用复制到 b 中。这不影响a。
引用类型的概念是 OOP 程序员中最令人困惑的事情。
运行下面的代码,你会惊讶地看到答案:
创建一个Book
具有调用属性的简单类,并在应用程序的方法中Name
编写以下代码。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 行,您会期望答案是“book b”。您认为 as c是a,然后a变成b ,这也将使c等于b。
事实并非如此!
在 Ballon 类比中阅读 Ballon anology 以获取 Reference type。
不!
您所做的是创建两个对字符串“Hello”的引用('a','b')。随着b = "Hi"
您更改“b”以引用字符串“Hi”。
'a' 永远不会改变这种方式。