【发布时间】:2012-04-04 05:23:53
【问题描述】:
据我所知,C# 中的字符串是引用类型。
所以在下面的代码中'a'应该等于“Hi”,但它仍然保持它的值“Hello”。为什么?
string a = "Hello";
string b = a;
b = "Hi";
【问题讨论】:
-
@ZeNo:这与字符串不变性无关。这是正常的引用类型行为。
标签: c# string value-type reference-type
据我所知,C# 中的字符串是引用类型。
所以在下面的代码中'a'应该等于“Hi”,但它仍然保持它的值“Hello”。为什么?
string a = "Hello";
string b = a;
b = "Hi";
【问题讨论】:
标签: c# string value-type reference-type
许多答案指出字符串是不可变的;虽然这是真的,但它与你的问题完全无关。
更重要的是,您误解了引用在变量方面的工作方式。引用不是对变量的引用。将引用视为一段字符串。你从这个开始:
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,因为它们是相同的变量。请注意,变量的 type 不必是引用类型。
【讨论】:
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 程序员最困惑的事情。
运行下面的代码,你会惊讶地看到答案:
使用名为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 行,您会期望答案是“book b”。您认为 c 是 a 之后是 a 变为 b,这也将使 c 等于 b。
事实并非如此!
【讨论】:
不!
您所做的是创建两个对字符串“Hello”的引用('a','b')。
使用b = "Hi",您将 'b' 更改为引用字符串“Hi”。
'a' 永远不会这样改变。
【讨论】: