字符串行为说明

本文关键字:说明 字符串 | 更新日期: 2023-09-27 18:34:51

对象是引用类型;所以这段代码会打印出 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"。我的问题是这个;由于字符串是引用类型,因此当您声明对象 Hello 时,字符串 s 是否包含对该对象的引用?字符串 t 也包含对该对象的引用?Hi 没有打印出来的原因是因为不可变性?

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

我想牢牢掌握基础知识,我感谢大家对我在这里发布的愚蠢问题的耐心:)

字符串行为说明

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

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

string s = "Hello";

在此行中,您有一个 "Hello" 对象和对该对象的引用,称为 s

string t = s;

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

s = "Hi";

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

Console.WriteLine(t);

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

而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 相同的行为。

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

// 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