我知道.NET中的String是Object的子类,.NET中的Objects是引用类型.因此,下面的代码让我感到困惑.你能帮我理解一下这个区别吗?谢谢
我宣布了一个名为MyInt的类:
class MyInt
{
int i;
public int number
{
get { return i; }
set { i = value; }
}
public override string ToString()
{
return Convert.ToString(i);
}
}
Run Code Online (Sandbox Code Playgroud)
然后是以下代码:
MyInt a = new MyInt();
MyInt b = new MyInt();
a.number = 5;
b.number = 7;
b = a;
a.number = 9;
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
Run Code Online (Sandbox Code Playgroud)
产量:
9
9
Run Code Online (Sandbox Code Playgroud)
我理解这是因为这是一个Object = Reference Type,因此a和b现在引用堆上的同一个对象.
但这里发生了什么?
string a1;
string b1;
a1 = "Hello";
b1 = "Goodbye";
b1 = a1;
a1 = "Wazzup?";
Console.WriteLine(a1);
Console.WriteLine(b1);
Run Code Online (Sandbox Code Playgroud)
这会产生:
Wazzup?
Hello
Run Code Online (Sandbox Code Playgroud)
String是一个被区别对待的对象吗?
首先,我们创建两个字符串变量.现在,他们没有引用任何内容,因为它们没有被初始化:
string a1;
string b1;
Run Code Online (Sandbox Code Playgroud)
接下来,创建一个值为"Hello"的字符串,并返回对内存中该空间的引用. a1设置为该引用:
a1 = "Hello"; // a1 points to a place in memory with a string containing "Hello"
Run Code Online (Sandbox Code Playgroud)
接下来,创建一个值为"Goodbye"的字符串,b1设置为引用该字符串.
b1 = "Goodbye";
Run Code Online (Sandbox Code Playgroud)
接下来我们做:
b1 = a1;
Run Code Online (Sandbox Code Playgroud)
此赋值将复制引用的值.现在,b1指向字符串a1指向,并且"Goodbye"无法访问.由于字符串总是在堆上分配,因此垃圾收集器最终会停止并清理"Goodbye"正在使用的内存,因为没有任何引用它.*
*编辑:从技术上讲,这可能不是真的,因为字符串常量将被实习并因此被实习表生根 - 但我们只是说这些字符串来自数据库或其他东西.
接下来,一个值为"Wazzup?"的字符串.创建,a1设置为对该的引用:
a1 = "Wazzup?";
Run Code Online (Sandbox Code Playgroud)
"Hello"字符串仍然被b1变量引用,因此它是安全的.考虑到这一切:
// Prints "Wazzup" because we just set a1 to a reference to that string
Console.WriteLine(a1);
//Prints "Hello" because b1 still has its value it had copied over from a1
Console.WriteLine(b1);
Run Code Online (Sandbox Code Playgroud)
希望这能澄清事情.
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |