据我所知,C#中的字符串是引用类型。
因此,在下面的代码中,'a'应该等于“Hi”,但它仍然保持其值为“Hello”。为什么呢?
string a = "Hello";
string b = a;
b = "Hi";
答案 0 :(得分:28)
许多答案指出字符串是不可变的;虽然这是事实,但这与你的问题完全无关。
更重要的是,您误解了引用如何与变量一起工作。引用不是对变量的引用。将引用视为一段字符串。你从这开始:
a----------------------Hello
然后你说“b = a”,这意味着将另一段字符串附加到a
附加到的相同内容中:
a----------------------Hello
/
b---------------------
然后你说“现在将b附加到你好”
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,因为它们是同一个变量。请注意,变量的类型不必是引用类型。
答案 1 :(得分:7)
第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"
答案 2 :(得分:1)
您正在更改参考b。不是。在对象保持不变的情况下复制引用本身。所以b =“Hi”将对“Hi”对象的引用复制到b中。这不会影响到。
答案 3 :(得分:1)
参考类型的概念是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行,你会认为答案是“b预订”。你认为 c 是 a ,之后 a 变为 b ,这也会使 c 等于 b 。
情况并非如此!
答案 4 :(得分:0)
NO!
你做的是为字符串“Hello”创建两个引用('a','b')。
使用b = "Hi"
,您可以更改“b”以引用字符串“Hi”。
'a'永远不会改变这种方式。