字符串行为说明
本文关键字:说明 字符串 | 更新日期: 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