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

时间:2012-04-04 05:23:53

标签: c# string value-type reference-type

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

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

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

5 个答案:

答案 0 :(得分:28)

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

更重要的是,您误解了引用如何与变量一起工作。引用不是对变量的引用。将引用视为一段字符串。你从这开始:

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,因为它们是同一个变量。请注意,变量的类型不必是引用类型。

答案 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

情况并非如此

Ballon analogy for Reference type阅读气球神学。

答案 4 :(得分:0)

NO!

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

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