对象是引用类型;所以这段代码将打印出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的原因?
或者声明时声明的字符串是否像值类型一样保持对象的实际值?就像在第二个代码示例中一样。
我希望能够牢牢掌握基础知识,感谢每个人对我在这里发布的愚蠢问题的耐心:)
答案 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
的行为相同。