字符串行为的说明

时间:2014-12-20 11:45:28

标签: c# string

对象是引用类型;所以这段代码将打印出Angelo。

    Object o = new Object();
    o.Name = "Michael";
    Object p = o;
    o.Name = "Angelo";
    Console.WriteLine(p);

我读到该字符串是一个引用类型,但其行为很像值类型(如int)。

int x = 10;
int y = x;
x = 20;
Console.WriteLine(y);

上面的代码将打印10,因为y复制变量x中的实际值。现在为字符串:

string s = "Hello";
string t = s;
s = "Hi";
Console.WriteLine(t);

现在上面的字符串代码将打印“Hello”。我的问题是这个;因为string是一个引用类型,当你声明它时,字符串s是否保存对象Hello的引用?字符串t还包含对该对象的引用?并且因为Immutability而没有打印出Hi的原因?

或者声明时声明的字符串是否像值类型一样保持对象的实际值?就像在第二个代码示例中一样。

我希望能够牢牢掌握基础知识,感谢每个人对我在这里发布的愚蠢问题的耐心:)

3 个答案:

答案 0 :(得分:3)

让我试着逐行解释这里发生的事情;

首先,string引用类型,引用类型有两件事。该对象的对象引用

string s = "Hello";

在这一行中,您有一个"Hello"对象和一个名为s引用

string t = s;

在这一行中,您有一个名为t的引用,它引用了"Hello"引用的同一个对象(s)。

s = "Hi";

在此行中,您将创建一个名为"Hi"的新对象,而您的s引用现在引用对象。它不再引用"Hello"对象

Console.WriteLine(t);

由于t 仍然引用"Hello"对象,因此将打印此字符串。更改s引用的对象不会影响它。

答案 1 :(得分:1)

您可以通过各种方式声明和初始化字符串,如

// Declare without initializing. 
string message1;

// Initialize to null. 
string message2 = null;

// Initialize as an empty string. 
// Use the Empty constant instead of the literal "".
string message3 = System.String.Empty;

+ =运算符创建一个包含组合内容的新字符串。该新对象被分配给变量s1,并且分配给s1的原始对象被释放用于垃圾收集,因为没有其他变量保存对它的引用。

string s1 = "A string is more ";
string s2 = "than the sum of its chars.";

// Concatenate s1 and s2. This actually creates a new 
// string object and stores it in s1, releasing the 
// reference to the original object.
s1 += s2;

System.Console.WriteLine(s1);
// Output: A string is more than the sum of its chars.
看看这个链接,可以解决你的问题; http://msdn.microsoft.com/en-IN/library/ms228362.aspx

答案 2 :(得分:1)

  

和Hi没有打印出来的原因是因为不变性?

不,你没有做同样的事情。如果你这样做:

Object p = o;
p = new Object();
o.Name = "Angelo";
Console.WriteLine(p);

这显然不会影响p。所以这与不变性无关。当你分配一个新的参考时,你就扔掉了旧参考。当你说:

s = "Hi";

它会创建一个新的string对象并将其引用存储在s中。这是默认行为。

唯一的例外是当您使用ref关键字和引用类型参数时,它会更改它的引用。例如:

void Foo(ref string x)
{
    x = "Hi!";
}

string s = "Hello";
Foo(ref s);
// now s is 'Hi!'

请注意,如果您可以更改string的属性,则可能会发现strings的行为相同。